【RipCD】カーオーディオへのさらなる対応と改善
開発::util
序
CarAudio2000は、私の個人的な環境(古めのクルマに乗っているために音楽を楽しむにはCD化が必要)に対応したツールである。
この話題は何度か扱っており、デジタルミュージックライブラリをCDにするでプレイリストをCDにするという話をした。 で、実際にこれでデジタルプレイリストをCDに変換、カーオーディオで楽しんでいるのだが、やはりlossyな音源のままというのは気持ち悪いので、プレイリストの「逆変換」をするスクリプトで(ポータブルライブラリ向けに作った)そのプレイリストをオリジナルのアーカイブ上のプレイリストに変換する方法を編み出し、これで心置きなく楽しめるようになった。
だが、まだ足りない。 私のカーオーディオはCD-TEXTに対応しているのだ。
CD-TEXTはごく一時期の音楽CDにあったもので、CD-TEXT対応プレイヤーで再生すると、楽曲の情報が表示される、というものであった。 連装CDデッキなどと同様、当時の最先端技術で、「プレイヤー上に曲名が表示されるなんて!」という未来感を出していたのだが、重大な問題――再生エラーになったり、製造エラーになったりする――があり、あんまり採用されることなく廃れたものだ。
実は市販CDでCD-TEXTを採用したものはあまり現れなかった一方、ごく一時期、CD-RでオリジナルCDを作るのが流行っていた頃、そのCD-Rへの書き込みでCD-TEXTが復権していたことがある。 MP3が一般化する(MP3対応CDプレイヤーとかも登場する)までの数年の間ではあるが、対応プレイヤーはそこそこあった。 これは、MDでは楽曲情報を付与することができるため、MDプレイヤーは情報ディスプレイを持たせることが多く、結果としてデッキはCD-TEXTに対応する、というような形だ。
ただし、CD-TEXTはレッドブックによって規定されているものの、仕様が公開されていないメーカー向けのシークレットだ。
私のカーオーディオはCD-TEXTに対応していて、しかしながらアルファベット表示しかできない(日本語は出ない)という代物。 別にそんなにこだわりはないのだけど、一応ディスプレイにCD-TEXTモードがあるし、私が運転中にディスプレイを眺めることなんてあるわけもないが(そもそも私が作ったプレイリストだから曲を聞けば曲は分かるし)、使わないのも気分が悪いのでがんばって対応してみることにした。
対応方法
Cdrdaoを使う。
以前の記事で言及したが、単にオーディオファイルをCD-Rに焼こうとすると、wodimでは失敗してしまう。
xfburnを使う場合はオーディオCDとして適格なWAVファイルにしておけばうまくいくことから、変換してxfburnで焼く、という方法を今まで取ってきた。 だが、xfburnを使うと書き込みが結構遅く、またやや安定しない。 cdrdaoを使うほうがよっぽど快適なのでできればcdrdaoを使いたいと考えてきた。
cdrdaoはtocファイルでCD-TEXTにも対応しているため、オリジナルのtocファイルをコンパイルしてcdrdaoで焼くことを目指した。
tocファイルを作る
tocファイルの形式は、cdrdaoのmanpageに例があり、これが適用できる。
CD_DA
CD_TEXT {
LANGUAGE_MAP {
0 : EN
}
LANGUAGE 0 {
TITLE "CD Title"
PERFORMER "Performer"
DISC_ID "XY12345"
UPC_EAN ""
}
}
TRACK AUDIO
ISRC "DEXXX9800001"
CD_TEXT {
LANGUAGE 0 {
TITLE "Track Title"
PERFORMER "Performer"
ISRC "DE-XXX-98-00001"
}
}
PREGAP 0:2:0
FILE "data.wav" 0
CD-TEXTは英語しか扱えない、ということが逆に楽にしてくれている。 言語についての解説があんまりないため、ちょっと困るのだ。
デジタルプレイリストからの変換なので、プレギャップはいらない。 また、デジタルプレイリストであるためにCD自体のタイトルとかもいらない。
ここへらんを抜いてコンパイルすることにする。
TITLE(楽曲タイトル)とPERFORMER(楽曲アーティスト)の項目だが、そもそもプレイリストが参照しているのはメタデータを持っているデジタルオーディオなので、そこから取れば良い。
方法は色々あるが、私はタグの取り扱いにKid3を使っているため、kid3-cli
を使うことにした。
kid3-cli -c "get title 2" $file
でID3tag
v2からtitle
を取得できる。同様にartist
も取得できる。
kid3-cli
は相手がmp3でもm4aでもFLACでも同じコマンドでいけるので楽。
日本語をアルファベットへ
別に日本語のままでも表示されないだけで支障はないんだけど、なんか不完全な感じがするのでがんばって変換してみることにする。
といっても、「望ましい形」への変換は現実的にできないので、できるだけ近い形にした上で少ない手間で手動修正という話になる。
日本語をローマ字へ変換する方法としてはKakasiがある。 こんな感じで変換できる。
% print 中恵光城 | kakasi -Ja -Ha -Ka -s -i utf-8 -o utf-8
naka megumi hikari shiro
……中恵光城(なかえみつき)さんが、なかめぐりひかりしろさんになってしまった。
ちなみに、なんで中恵光城さんなのかというと、Walkmanにはアーティスト名を認識する機能があり、漢字の名前のアーティストも五十音で索引できるようになっているのだが、これはWalkmanのデータベースで持っているアーティストに限られ、中恵光城さんは(私が持っている音源の、漢字で始まる方の中では唯一)認識されないからだ。 あ、でも中恵光城さんの歌、すごく大好きです。なんなら歌手で一番好き。
で、固有名詞が多いプレイリストでこれでは使い物にならない。 固有名詞といえばNeologdやnicodicだが、mozc-utをビルドする過程でmozcdic-utというのが出来る。 いっそこれこそがmozc-utの本体なのだが、これ自体はテキストファイルで、そんなに複雑な構造ではない。
Kakasiの辞書はひらがな 漢字
という形式の行からなるEUC-JPのテキストなので、
cut -f 1,5 mozcdic-ut-20220305.txt | sed -e 's/\t/ /g' | iconv -f utf-8 -t euc-jp -c >| mozcdic-kakasi.txt
とかやればKakasiで使うことができてしまうのだ。
% print 中恵光城 | kakasi -Ja -Ha -Ka -s -i utf-8 -o utf-8 mozcdic-kakasi.txt
nakaemitsuki
パーフェクト。
なお、アーティスト名に関しては本当にパーフェクトな結果を得たいことが少なくない(表記が重要だったりする)ので、artist-dic.yaml
というファイルでダイレクトに変換もできるようにした。
こっちのほうが有用かもしれない。
大きな辞書でKakasiを引くのは、まぁそれなりに時間がかかる。 結局はオマケ機能みたいなものだ。
expand-playlist.rb
はffmpegによる変換とtocファイルの生成を同時にやっていく。
設定ファイルで指定したディレクトリに必要なものは一通り揃う形だ。
焼く
tocファイルはそれほど複雑なものではないので、テキストエディタで開いてCD-TEXTを好みの形に仕上げるのは難しくない。
あとはcdrdaoで焼くだけ…… と言いたいところだが、もう一段罠がある。
cdrdao write --device /dev/sr0 playlist.toc
のように焼くわけだけど、多くの場合自動でgeneric-mmc
ドライバが選択される。
そして、generic-mmc
ドライバはデフォルトで書き込み時1CD-TEXTが有効になっていない。
そのため、
cdrdao write --device /dev/sr0 --driver generic-mmc:0x00000010 playlist.toc
のようにしてCD-TEXTを有効にして書かないといけないのだ。
さらに、ドライブ側でCD-TEXTに対応していないというパターンもなくはないので、非常に厄介。