過去の記事では、FLACやALACフォーマットをAudacity上で元のWAVファイルとの絶対誤差から復元(可逆性)を確認しました。 FLACやALACの可逆性を確認する方法の一つに「ファイルのハッシュ値を用いた評価方法」があります。 この評価方法は、ハッシュ値がファイル固有の文字列であることを利用し、WAVファイルから変換したFLACやALACファイルをデコード(WAV化)した後、デコード後のファイルのハッシュ値が元のWAVファイルと一致すれば、元のWAVファイルに復元された(可逆性がある)と判断できるというものです。
今回は、この「ファイルのハッシュ値を用いた評価方法」でFLACやALACの可逆性を確認し、更にこの評価方法の妥当性を確認したいと思います。
FLACとALACについて
FLAC は、Windows、Linux、macOS、Androidなどの広範なプラットフォームでサポートされています。オープンソースであるため、多くのサードパーティのアプリケーションでも利用されています。 ファイルの拡張子は、✗✗✗✗.flac になります。
一方のALAC は、Appleが開発したフォーマットで、主にApple製品(iPhone、iPad、Macなど)で利用されます。iTunesやApple Musicでの利用に最適化されており、Appleのエコシステム内で高い互換性を持っています。 ファイルの拡張子は、AACと同じ、✗✗✗✗.m4a になります。 【ALACが MPEG-4 Audio フォーマット(通常のオーディオストリームが格納されるコンテナ形式)を使用しているため拡張子がm4aになります。】
FLACやALACは可逆圧縮を用いるため、圧縮前と圧縮後の音質は基本的に同じです。 つまり、FLACやALACをデコードした後に得られるWAVファイルは元のWAVと完全に一致しハッシュ値も一致するはずですので、ハッシュ値が一致すれば音質は元のWAVと全く同じだと考えられます。 ただし、FLACやALACを直接再生する場合、使用するソフトウェアやハードウェアの違いにより、再生環境によって音質に差異が生じることがあるため、注意が必要です。
ハッシュ値について
ハッシュ値とは、あるデータ(例えばファイルなど)に対して計算される固定長の文字列や数字のことです。 この値は、元のデータの内容に基づいて計算され、データが変更されていないか、あるいは一致するかどうかを確認するために使用されます。 ハッシュ値の計算は簡単です。 ターミナルを開いて下のコード(ファイルはフルパス)を実行すると、ファイルのハッシュ値が表示されます。
ハッシュ値の計算
bash command sha256sum "original.wav" # 実行すると グリーンの文字列がハッシュ値です。 5a7caf857cb52ac0bb44581669f61f7d6f88ea35f5d9f7140c9f16fa789e8ef1 original.wav
異なる入力から同じハッシュ値が生成される現象を衝突と呼びます。 SHA-256の場合、衝突が発生する確率は「2の128乗分の1」であり、実質的にゼロに近いと言えます。
ハッシュ値によるFLAC又はALACの復元性を確認する手順
wavファイルをFLAC及びALACに変換したファイルをwevにデコードした時、元のwevファイルに正しく復元されているか(ファイルの同一性)をハッシュ値で確認する手順です。
- 元のWAVファイルのハッシュ値を計算
- FLAC(or ALAC)ファイルをWAVにデコード(復元)してハッシュ値を計算
- 元のWAVファイルと復元したWAVファイルのハッシュ値を比較してハッシュ値が一致すれば、ファイルは正しく復元されていると言えます。
ファイルAとファイルBのハッシュ値を比較するアップルショートカットアプリ・ツールの作成
ターミナルを開いて、夫々のファイルのハッシュ値を計算しハッシュ値の長い文字列を比較するのは面倒ですので、アップルショートカットアプリを使って【compare hash】ツールを作成しました。 新規ショートカットの作成については、Apple公式サイトで参照ください。
下の画像は「ショートカットエディタ」に各アクションをレイアウトした画面です。 このプログラム(ワークフロー)は7つのアクションで構成されています。
下に「ショートカットエディタ」のスクリーンショットを掲載しておきますので、関心のある方はこれに倣ってショートカットを作成してみてください。
「シェルスクリプトを実行」エリアに下のコードをコピペする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# ファイルのパスを引数で受け取る fileA="$1" fileB="$2" # ハッシュ値を計算(awkでハッシュ値のみ抽出) hashA=$(sha256sum "$fileA" | awk '{print $1}') hashB=$(sha256sum "$fileB" | awk '{print $1}') # ハッシュ値の比較 if [ "$hashA" == "$hashB" ]; then osascript << EOF display alert "ファイルAとファイルBのハッシュ値は一致しました。\n\nファイルA&B:${hashA}" EOF else osascript << EOF display alert "ファイルAとファイルBのハッシュ値は一致しません。\n\nファイルA:${hashA}\n---\nファイルB:${hashB}" EOF fi |
以上でショートカットアプリを使った【compare hash】ツールの完成です。
(下の操作Videoを参照)
【compare hash】ツールを使ってハッシュ値のファイル比較をしてみました。
TEST
1 FLAC及びALACの復元性(確認)
- オリジナル:レコードからFLAC(24bit 96khz)で収録しwavに変換したファイル
Handel Violin Sonata No_4 Vn_Grumiau.wav - FLAC:オリジナルファイルをFLACにエンコードし、WAVにデコードしたファイル
Handel Violin Sonata No_4 Vn_Grumiau_FLAC.wav - ALAC:オリジナルファイルをALACにエンコードし、WAVにデコードしたファイル
Handel Violin Sonata No_4 Vn_Grumiau_ALAC.wav
【compare hash】ツールで確認すると、全ての組み合わせで、
ハッシュ値が一致しました。
ファイルA&B:のハッシュ値5cced0055c6cd106a1657a51706df7619fd6e084ba42775ea70d0b12e42731b3
TEST
2 文章に半角スペース有り無しのtextファイルを作成し比較する(参考)
ファイルAとファイルBのハッシュ値は一致しません。
ファイルA:のハッシュ値7145be38c54f0292d5b4b2c85bed7eba8f288ede197587522490c8708aeffb7b
---
ファイルB:のハッシュ値bc9727e268e2fc89c2c076ad52d29ad0ad5bf32adbcb6f4440be7d8fc11dec66
ハッシュ値の比較が正しいか?念の為「WaveCompare」ソフトで確認
「WaveCompare」ソフトは、WAVファイル同士のサンプルレート単位でデジタルデータを比較できるefuさんが開発されたWindowsソフトです。
WaveCompareのDL先:https://efu.sub.jp/soft/wc/wc.html確認結果