ファイルの破損・修復                         (C)Y.Utsunomia 2008-2010 この項に対応する練習問題が、「練習問題第1集」に2問収められています。 ひととおり読破されたら、是非問題を解き、手法を身につけることをお勧めします。 また、このテキストの主要部分は、「トラブルシューティング」からのシングルカット です。 症状: フィールドワークしてきた音データや、他人からもらった音データを、audaci tyなどで開いたら、途中までは正常に波形表示されて音も再生できるが、途中か らフルスイング(最大レベル=0dBに達したことを指す)のホワイトノイズにな ってしまう。またそのノイズ部分を注意深く聴くと元の音らしきものがかすかに 聴こえる。    "byte_drop_1.bmp""byte_drop_1a.gif"参照 原因: これらのデータは何らかのコピーを経て(それがオリジナルのフラッシュメモ リーカードであっても)読み込まれるが、そのどこかの過程で1バイト(8ビット    )あるいは数バイトの欠落が生じワードのフェーズ(位相)ずれが生じるとこの    ような結果となる。    16ビットデータは2バイト、24ビットデータは3バイト単位で1ワード(最小単位、    あるいは1サンプル)を構成するが、何らかの原因で1バイト欠損すると、それ以    降の部分の下位8ビットと上位8ビットが入れ替わってしまい(16ビットの場合)    ノイズ化してしまう。  | hedder | Lch下位・Lch上位・Rch下位・Rch上位・Lch下位・Lch上位・Rch下位・    Rch上位・Lch下位・Lch上位・Rch下位・Rch上位・ ・ ・ ・ファイル構造    Lch下位とかRch上位がそれぞれ8ビット(十六進数2桁)の一塊で、1バイトと呼    ぶ。16ビットデータの場合、2塊で1ワードと呼び、1つのチャンネルの1つのサン    プルである。そのサンプルが、LchとRchが、Lch先頭で交互に連ねられる。(24    ビットデータの場合は3バイト(3塊)で1つのチャンネルの1つのサンプルとな    る)コピーなどの様々な伝送系では1バイト単位で管理されるため、多くの場合    バイト単位で欠損やエラーが生じる。(管理の方式によるが・・・)     このデータ列から1バイト欠損すると、欠損以降のそれぞれの下位と上位のデ    ータが入れ替わってしまい、結果として「フルスイングのノイズ」あるいは「オ    ーバードライブの効いた」信号に変化する。2バイト欠損すると、LchとRchが入    れ替わってしまう。    この現象はコピーのどの過程でも生じる可能性があり、とくに虚弱な通信回線に    よる伝送や、バッテリーを内蔵したハードディスクドライブ(フォトストレージ    ャー)にストレージしたとき、あるいは低速のカードやカードリーダを使用した    ときに、たまに発生する。    ちなみに8ビット音声データでは欠落は欠落だが、それ以降がノイズ化する症状    は起きない。   注)hedder(ヘッダー)はファイルを作成したソフトやマシンにより、サイズが異    なる。hedderの一部が壊れても同様の症状(ファイル先頭から全編ノイズに)が    現れる。(後述) 対応: あわてずに、データの最初からいくつのサンプルのところからノイズ化してい    るかを書き留め、念のために再度読み込みなおしてみる。audacityの場合は、途    中からノイズ化したトラックをそのまま消去せずにに、再度読み込み直すと容易    に場所の比較ができる。    もし異なる場所で発生しているなら、何度か読み込み直すと正常に読み込める場    合もあるかも・・。(もし正常に読み込めたら、さっさと正常なドライブへ書き    出しておく)    何度読み込み直しても同一場所でノイズ化が起こるようなら、その読み込んでい    るメディアにコピーをするときに上記の「バイト欠落」と「ワードのフェーズず    れ」が起こっている。     以下はそれなりに専門的な処理であるが、確実に修復できる可能性があるので、    とくに重要なデータで生じた場合には「必ずコピーを作成し」修復実行する価値    がある。またそのような事態に備えてシミュレーション訓練(故意に1バイト欠    損をつくり、それを修復すること)してみることも楽しい。    またこの原理や手法を知らない者に対しては、暗号化処理として使用できるかも。    (筆者提唱コード:例:70FB=16進で70バイト目にFBを挿入すると復元、など)    貪欲なアーチストなら、エフェクトとして使えるようになって欲しいところだ。    「そのほかの有用なソフト」に推奨される「バイナリー・エディター」やそれら    と同等のソフト(一部のマシン語モニターなどであるが、推奨フリーソフトは十    分に高性能です)を用意する。     ○詳しい解説は限られた紙面では不可能だが、普通のテキストエディタなどと作法は同じ    で、読み込んだ内容を変更し上書きすれば、元のファイルを書き換え、名前をつ    けて保存にすれば新たにそのファイル名でファイルが作成される。    また表示は画面左側に16進コード(バイナリなので2進表記したいところだが、    それでは画面を多く使いすぎるので、    一般的に16進<0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F>2桁、    例えばFFとか)を、    右側に16進2桁で表現される文字キャラクタを表示することが慣わしとなってい    る。    「16進2桁で1バイト・・・重要!!!」     難しそうに見えるが、欠損のあるデータをドラッグアンドドロップで読み込ま    せてみよう。16ビット音声データの場合は1バイトおきに規則性があることが見    えるはずだ。(24ビットデータの場合は3バイトおきの規則性)    その規則性が、ノイズ化しているところで乱れているはずなので、その部分を探    す。探し方は簡単で、先にメモしたノイズ化した場所がファイルのどのあたりで    あるかを参考にバイナリエディタの右カーソルをその場所の少し前に持って行き    、そこか    らスクロールしていけば規則性の乱れたところは容易に発見できるはずだ。    "byte_drop_dump_16bit.gif""byte_drop_dump_24a.gif"を参照    この画像例はDANDP.exeを用いているが、これは特定コードを色分け表示できる    のでわかりやすい点を考慮したもので、実際の音声データは長大なものであるこ    とが多く、Dump4w.exeのほうがそのような長大ファイルを開くには向いている。    DANDP.exeではオーバーフローすると直ちにプログラムが落ちる。 ○規則性が見出せない場合の対応(対象ファイルが16bitステレオファイルであるとし    て)    規則性が見出せない場合の理由は、多くの場合録音レベルが高く、そのためにFF    や00が規則的に出現しないことが原因である。いくつかの回復手法がある。 1)破損箇所までを「増幅」で正確に(数値入力で)-20dB程度レベルを下げる    とFFや00の出現率が上がり、バイナリ・エディタで読み込んだときに判別しやす    くなる。    1b) バイナリエディタで欠損部分にダミーデータを挿入後、下げたレベルを上    げて回復する(回復のためには下げるときに「どの場所・・・正確な時間をサン    プル単位で書き取っておく」を「どれくらい下げたのか」メモしておく)。    2)破損箇所までの正常部分と、破損箇所以降をaudacityで別ファイルとして分    離出力し、    2a)破損箇所ファイルをバイナリエディタで読み込み、ヘッダーが終わったとこ    ろにダミーデータを挿入する。    2b)audacityで正常部分に次いで修正した破損部分を読み込み、接合する。    3)どうしても分離・接合修復が美しいと思えない場合・・・    audacityで時間軸拡大を行いながら、正確に破損箇所を特定し、カーソルを打    つ。    仮に44秒20595サンプルであるとしよう。audacityの画面下部の時間窓はサンプ    ル数を表示できるモードにしておく必要がある。(audacity1.3.x)    3a)バイナリエディタにファイルを読み込み、算出されるバイト数の部分にカー    ソルを移し、ダミーデータを挿入し修正する。    算出方法(16bitステレオデータの場合)    欠損データ位置=ヘッダーサイズ+(サンプル数X4) --サンプル数プレーン表示    が便利    =47+((44X48000)+20595)X4)  --秒+サンプル数の場合           =47+8530380           =8530429(10進数)           =8229FB(16進数)16進数へ変換がわからない場合は、そのほか    の有用なソフトの項で推奨している「Ccalc.exe」を用いれば一発変換できる。    位置がわかればバイナリエディタで、「ジャンプ」コマンドで移動し、修正する。    注意:ヘッダーサイズは作成ソフトや設定によって変化するので、自分の使用す    る設定のヘッダーサイズを確認する必要がある。上記の47(2Fh)バイトはaudaci    ty1.3.7でメタデータなどの設定が一切ない場合の数値。BWFの場合は、一般に    ヘッダーサイズは巨大になる。どこまでがヘッダーなのかどうしてもわからな    い場合、一旦audacityで読み込み出力すると、従来の.wavヘッダーになる。     同じaudacityであってもヘッダーのサイズ保障は無いので、自分の環境でど    れくらいのサイズのヘッダーが作成されるかは確認のこと。   参照)ヘッダーの終わりは...data.|なのだが、一般にその後数バイトのGAPが設    けられるようだ。このGAPがソフトによりまちまちで、ゆえに確認の必要がある。    ちなみに24bitステレオデータの場合    欠損データ位置=ヘッダーサイズ+(サンプル数X6)    16bitモノデータの場合    欠損データ位置=ヘッダーサイズ+(サンプル数X2)    24bitモノデータの場合    欠損データ位置=ヘッダーサイズ+(サンプル数X3)     修復は「どうすれば規則性を取り戻せるか」を考えながら、欠損があると思わ    れる場合はダミーデータ(適当な数値1バイトあるいは数バイト)を挿入、同一    の数値が並んでいる場合は欠損とは逆の問題なので削除をし、とにかく規則性を    取り戻す。     修復が完了したらaudacityで読み込んでみる。多くの場合修正箇所(もともと    ノイズ化が始まった場所)で「プツッ」というノイズが発生するが、これはダミ    ーデータがダミーであるため(本来あるべきデータではないという意味)起こる    ので、その部分を拡大し、ペンシル・ツールやエンベロープ・ツールで修正しよ    う。     このような伝送系では、このバイト欠損は一箇所であるとは限らないので、    修正した箇所以降で再びノイズ化する場合は、根気よく修復を繰り返そう。 関連: 一般的に.WAVオーディオファイルと呼ばれるものは、xxbit PCM符号有り、あ    るいは signed xxbit PCM と呼ばれる形式で、無音部分は00 00にはならない。    この符号、あるいはsignedとは波形の+/−を先頭の1/0で表すように見えること    からこのように呼ばれるためで、無音は便宜上00 00H(16bit)、00 00 00H(24bit    )で表される(最後のHは16進データであることを表す)が、+側最大値は7F FF    H(16bit)または7F FF FFH(24bit)に、−側最小値は80 00H(16bit)または80 00    00H(24bit)になる。(audacityで論理出力=無音の作成、を行うと00Hが並ぶが)    意外とややこしいので、バイナリエディタで加工する場合、2進16進の変換がさ    らさらできなければ面倒なことになりかねないので注意する。(とりあえず    「Cculc.exe」が使えればよいのだが) 関連2: バイナリエディタで.WAVファイルを開いてみると、最初の部分にはオーディ    オデータではないデータが書かれていることがわかる。この部分が「ヘッダー」    と呼ばれる部分で、日付やファイル名、サンプリング周波数やビット数、場合に    よっては使用したレコーダーの型式や製造元も記入されている。閲覧は大いに    推奨するが、ヘッダーのむやみな変更は致命的問題を招くので、どうしても触り    たい場合は.wavデータファイル構造資料を入手し、「必ずコピー」に改変を行う    ように心がけましょう。    あるいは上記のように一旦audacityで読み込んで、単純にそのままファイル出力    するとヘッダーは整理され(メタデータなどの添付部分が無い場合、47バイト前    後になる)るのでこの機能を活用しよう。 修復後は、とりあえず、すぐにファイルアウトしておこう!! 関連3:ヘッダーが破損している場合    他の.wavデータを貼り付ければ再生できるようになるが、そもそもヘッダーには    ファイルサイズ、サンプリング周波数、ビット深度などの必須データが含まれる    ため、これらの要素が異なっていると、正常再生はできない。ヘッダーが壊れて    いる場合、そのファイルの上記要素がわかっているか推論できる場合、audacity    で同じ要素の組み合わせの「無音」ファイルを作成し、ファイル出力し、そのフ    ァイルのヘッダーをコピーし、ヘッダー破損ファイルの先頭に挿入接合すれば、    再生可能となる。    それとはべつに、    audacityにはこのようなヘッダー不明のファイルを読み込む専用のモードがある。    左上のファイルプルダウンメニュー→取り込み→RAWデータの取り込み を指定    しファイル読み込みすると、上記要素の入力画面が現れるので、全てを入力する    と読み込むことができる。    しかし、ヘッダーの残骸が残っていると、うまく読み込めない場合もあり、その    ような場合は、ヘッダーの残骸をバイナリエディタで削除し、その後audacityで    読み込むと改善できる。「うまく読み込めた」とはファイルがノイズ化していな    いか(歪んでいないか)、L/Rは入れ替わっていないか、などである。    (ヘッダーは・・・dataの文字列まで)    audacityはRAWモード読み込みする場合、その先頭からデータチャンクとして読    み込むので上記のようなワード位相ずれがあると正常に読み込まれない。    16bitステレオデータとして読み込め、と指示すると、先頭から    Lch下位・Lch上位・Rch下位・Rch上位・Lch下位・Lch上位・Rch下位・Rch上位・・    のように読み込む。ところが先頭に1バイトごみがあると、    「ゴミ」・Lch下位・Lch上位・Rch下位・Rch上位・Lch下位・Lch上位・Rch下位・Rch上位・・・    のように読み込むべきところを    Lch下位・Lch上位・Rch下位・Rch上位・Lch下位・Lch上位・Rch下位・Rch上位・・    と、読むため上位と下位が入れ替わりノイズ化するのである。    正常と思われない再生状態の場合、とにかくバイナリエディタで、先頭から1バ    イトずつ削って読み込んでみる。1バイトずつ3回作業を繰り返せば(そのファイ    ルが16あるいは24ビットデータの場合)最良の結果が得られることになる。    この作業と似て非なる設定がaudacityには用意されており、それはRAWデータの    設定画面で、「バイト順序」の項目があるが、ここでの設定は通常「ビッグエン    ディアン」なのだが、もとのファイルが.wavの場合、ほかの設定にすると正常読    み込みできなくなるので注意。    この設定をリトルエンディアンに設定すると、一見ワード位相が正常化したよう    に見えるが、L/Rの上位と下位が市松模様に入れ子になってしまうので、この設    定にしてはいけません。    また、モノなのかステレオなのかも判別可能で、モノをステレオとして読み込ん    だ場合、1オクターブ高い音程でやや歪んだ音になり、逆にステレオをモノとし    て読み込んだ場合、1オクターブ音程が下がり、同様にやや歪んだ音になる。