Audacityがオーディオ書き出しに失敗して、たくさんのauファイルができたときのはなし


事の起こり

WindowsのAudacityで1時間くらい録音した後、mp3に書き出そうとしてらそのまま固まりました。
このタコOS!! (注: OSの問題なのかは不明です)

その後しばらく放置しても何の反応もなく、泣く泣くシャットダウン処理に行くと強制終了するか尋ねられたので、
NO!! と回答したら、プロジェクトの保存するか聞かれたのでした。

しめた!! と思ったのですが、保存されたディレクトリを見てみると、

└── e00                
    ├── d00            
    │   ├── e0000005.au
    │   ├── e0000006.au
    │   ├── e0000013.au
    │   ├── e0000024.au
    │   ├── e000003a.au
    │   ├── e000003d.au
    │   ├── e0000061.au
    │   ├── e0000070.au
    │   ├── e000008f.au
    │   ├── e00000b1.au
    │   ├── e00000c6.au
    │   ├── e00000ce.au
    │   ├── e00000e6.au
    │   ├── e00000e9.au
    │   ├── e00000f9.au
    │   ├── e0000104.au

...

    │   ├── e0000fba.au
    │   ├── e0000fd0.au
    │   ├── e0000fd6.au
    │   ├── e0000fe9.au
    │   ├── e0000fec.au
    │   ├── e0000ff2.au
    │   ├── e0000ff7.au
    │   └── e0000ffe.au
    ├── d01            
    │   ├── e000100f.au
    │   ├── e0001011.au
    │   ├── e0001018.au
    │   ├── e000101d.au
    │   ├── e000103c.au
    │   ├── e0001072.au
    │   ├── e000107f.au
    │   ├── e0001096.au
    │   ├── e000109e.au
    │   ├── e00010c0.au
    │   ├── e00010dc.au
    │   ├── e00010e5.au

...

    │   ├── e0001fb5.au
    │   ├── e0001fc1.au
    │   └── e0001fe1.au
    └── d02            
        ├── e0002025.au
        ├── e0002029.au
        ├── e000203e.au
        ├── e000204c.au
        ├── e000205d.au
        ├── e000206d.au
        ├── e0002071.au
        ├── e000207f.au
        ├── e00020c0.au 

...

        ├── e0002e56.au
        ├── e0002e6c.au
        ├── e0002e6e.au
        ├── e0002e76.au
        ├── e0002e84.au
        ├── e0002e88.au
        ├── e0002e93.au
        ├── e0002efc.au
        ├── e0002f13.au
        ├── e0002f30.au
        ├── e0002f41.au
        ├── e0002f71.au
        ├── e0002f84.au
        ├── e0002f89.au
        ├── e0002f97.au
        ├── e0002fcc.au
        ├── e0002feb.au
        └── e0002ff4.au

と、大量のauファイルだけ残されておりました……。
なんとか一本の音声として復旧したい、というのが本記事の主旨です。
そして、一応私の場合は復旧できました。

auファイルとは?

Wikpedia によると、 今は亡き サン・マイクロシステムズのオーディオフォーマットのようです。
(0オリジンで数えて)4バイト目からの4バイトが、データへのオフセットのようです。
hexdumpすると以下みたいな感じ。

% hexdump -C e00/d00/e0000005.au | head -20
00000000  64 6e 73 2e 5c 30 00 00  ff ff ff ff 06 00 00 00  |dns.\0..........|
00000010  44 ac 00 00 01 00 00 00  41 75 64 61 63 69 74 79  |D.......Audacity|
00000020  42 6c 6f 63 6b 46 69 6c  65 31 31 32 00 80 3f bc  |BlockFile112..?.|
00000030  00 00 de 3b f2 95 61 3b  00 20 85 bd 00 a0 46 3d  |...;..a;. ....F=|
00000040  07 3d 20 3c 00 80 5c bc  00 00 4a 3c 2d 67 a5 3b  |.= <..\...J<-g.;|
00000050  00 40 f9 bc 00 40 cd 3c  31 e4 ee 3b 00 00 cb bb  |.@...@.<1..;....|
00000060  00 00 c0 b9 30 92 89 3b  00 00 30 ba 00 00 f8 3a  |....0..;..0....:|
00000070  1b a8 6e 3a 00 00 d7 bb  00 00 c0 39 7e 51 8c 3b  |..n:.......9~Q.;|
00000080  00 00 c0 bb 00 00 7a 3b  4d 76 57 3b 00 00 a0 b9  |......z;MvW;....|
00000090  00 00 52 3b 38 a4 0f 3b  00 80 23 bc 00 00 d0 b9  |..R;8..;..#.....|
000000a0  8f e7 ba 3b 00 00 0b bc  00 00 b0 39 64 5e 78 3b  |...;.......9d^x;|
000000b0  00 00 36 bb 00 00 b8 3a  a6 20 74 3a 00 00 04 bc  |..6....:. t:....|
000000c0  00 00 20 bb 23 37 d2 3b  00 00 e5 bb 00 00 80 39  |.. .#7.;.......9|
000000d0  48 1c 6c 3b 00 00 4e bb  00 00 30 3a 2c 49 9b 3a  |H.l;..N...0:,I.:|
000000e0  00 00 c1 bb 00 00 30 bb  29 a3 97 3b 00 00 4a bb  |......0.)..;..J.|
000000f0  00 00 04 3b 9c c5 9f 3a  00 00 a2 bb 00 00 00 3b  |...;...:.......;|
00000100  34 28 03 3b 00 00 d8 bb  00 00 38 ba 9f ab a7 3b  |4(.;......8....;|
00000110  00 00 10 ba 00 00 bc 3b  66 39 7a 3b 00 00 66 bb  |.......;f9z;..f.|
00000120  00 00 ba 3b 88 13 5c 3b  00 00 b7 bb 00 00 30 ba  |...;..\;......0.|
00000130  1d 95 8a 3b 00 00 c4 ba  00 00 06 3b 6d 85 90 3a  |...;.......;m..:|

".snd"ではなく"dns."となってるので、エンディアンを考慮するとデータ自体は0x305cから始まっている、と読めます。
実は、できあがってるたくさんauファイルのサイズも、それぞれ0x10305cバイトになっているという、いかにも0x100000バイト単位なファイルなのでした。

結合してみる

ひとまず、ファイルを名前順に聞いても時系列になっていないようでした。
なので、ファイルのタイムスタンプでなんとかします。
(タイムスタンプが飛んでいたら大変かも……。auファイルのヘッダにいるとよいですが……。)

% \ls --color=never -rt */*/*  > list.txt

これでタイムスタンプ順のリストをつくり……、

% for f in `cat list.txt`; do dd if=$f ibs=1 skip=12380 of=$f.bin; done 

で全てのファイルのヘッダを省いたデータ部分のみのファイルを作成し(12380=0x305c)、

% dd if=e00/d00/e0000005.au bs=1 count=12380 of=head.bin 

で、ひとまず先頭のファイルのヘッダーを拝借して、

% cat head.bin > output.bin 
% for f in `cat list.txt`; do (cat $f.bin >> output.au); done

な感じで結合しました。
このできあがったoutput.auをAudacityに読ませたところ、長いファイルだったので全て確認してませんが、しばらく聞いた感じだとうまく復旧できたっぽいです。
これをmp3やらに変換してめでたしめでたし。

ところで

最初、Audacityの特殊形式なのかと思ったので上記処理にしましたが、普通にauファイルを結合できるツールがあるんじゃないかな……。
なお、Audacity自体でやろうとすると大変そうでした。コマンドラインからいけたかもですが。