SLでラジオねた 日本語の曲名文字化け

おひさしぶりです~(ノ∀`;)
なんか椎間板がヘルニアっていて
長時間PCの前に座っていられないあきです。

日頃の着座姿勢って大事なのねー、と痛感しております。

本日の話題はSLのラジオ。仕組みは図のような感じ。
前々から気になっていたのは「チャット欄に表示される現在再生中の曲名とアーティスト名が日本語だと文字化けする」ってことです。



まあ、技術的には「ねとらじ」とかあのへんとまるで同じなので、やったことある方にはそんな難しい話ではないと思いますが。

今回は、SLの日本語ラジオ情報の文字化け解決策のはなし。


いくつか用語が出てきますが、それ先に説明しときます。

MP3ファイル:音楽データのファイル
ID3タグ:MP3ファイル内にくっついてる曲名やアーティスト名などなどの情報タグ
ストリーミングサーバ:大勢の人にデータを配信するサーバ。ラジオ局のアンテナ的な。
ソースクライアント:音の元になってるPC。まあ、ラジオ局のスタジオみたいな。

SLだと、リスナー各自のSLビューアーが音を出している感じです。

CLEARの店内放送に使っているサーバーはオープンソースのIcecast2というやつでレンタルVPSにインストールしています。

サーバーだけあっても音はでないので、ソースクライアントが必要です。
Winamp+edcastとかiTunes+Nicecastとかです。

まあ、アレコレいじってみたのですが問題点としてはID3タグの文字コードがキモになっているんですね。

端的に言うと、iTunesのID3タグの文字コードがUTF-16というやつなんですがSLビューアーは正しく解釈できないんですね。

で、これをUTF-16からUTF-8っていうのに、どっかで変換しないといかんのです。

VPS上にソースクライアントも置いちゃうとかするならソースクライアントを改造すれば何とかなるんですが自宅からWinAmpやiTunesの音源をVPS上のIcecastに接続している場合はIcecast側を改造するしかありません。

このへんのブログを参考にしてソースコードを修正して再コンパイルしてみました。
最新版のIcecastとブログで扱ってるバージョンは違うので差分ファイルあてるときはきをつけてくださいねー。

【 MP3ストリーミングでUTF-16なTAGの文字化けをなおす その1】
http://nyon2.blog.so-net.ne.jp/2011-04-12

【 MP3ストリーミングでUTF-16なTAGの文字化けをなおす その2】
http://nyon2.blog.so-net.ne.jp/2011-04-16

ただ、これだけだと、普通にMP3プレイヤーでラジオを聞く分には文字化けが治るんですが……SLだとどうも上手くいかんです。

そこで、今回はオープンソースの音源制御言語「Liquidsoap」をIcecast2とソースクライアントの間に挟んで変換してしまうと。

Liquidsoapのホームページ
http://savonet.sourceforge.net/

Liquidsoapは、LinuxメインですがWindowsでもMacOS Xでもうごくのでお好みで挟むことができます。

今回は、自宅PCのWidows上で動かすことにしてみました。

あ。ちなみにLiquidsoapはLinux由来のCUIベースのソフトなので単体でアイコンをクリックしても一瞬コマンドプロンプトが開くだけで何も起きません。

設定ファイル(というかスクリプトコード)を作りましょう。
set("log.file",true)

set("log.stdout",true)

set("log.level",4)

set("tag.encodings",["SHIFT_JIS","UTF-8","ISO-8859-1","UTF-16"])

set("decoder.mime_types.mad",["audio/mpeg","audio/MPA"])

set("harbor.icy",true)
set("harbor.bind_addr","127.0.0.1")

live = input.harbor(id="live",port=8001,password="xxxxxx",buffer=8.,max=20.,"aki2")

live = amplify(0.1,override="replay_gain", live)

output.icecast(%mp3,fallible=true,host = "your icecast host", port = 8000,password = "xxxxx", mount = "aki",live)
そんな長くもないです。

input.harborのところに設定してあるのと同じパラメータをedcastなりnicecastに設定してください。サーバー名はlocalhostか127.0.0.1で。
(これは自分自身に送信ということになります)

んで、従来ソースクライアントのedcastやnicecastに設定していたパラメータをoutput.icecastのところに書き込んでくださう。

仕組みは単純です。
Winamp+edcastのストリームをinput.harborで受け取ってoutput.icecastで外部のIcecast2サーバーに流しているだけですん。

ウチの環境だとなんだか音量がバカみたいに大きくて音割れするほどだったので、10分の1に音量を下げる1行を入れています。

live = amplify(0.1,override="replay_gain", live)

え?文字変換は? set("tag.encodings"....のところに、UTF-16やSHIFT_JIS入れておけばLiquidsoapが勝手にやってくれますん。

これをtest.liqとでも名前つけてLiquidsoapを展開したフォルダーに保存します。

Windowsのコマンドプロンプトは死ぬほど使いにくいので、最近こっそり入っているPowershellを起動しましょう。
(スタートメニューの検索欄でpowershellと打ち込んでみましょ)

んで、Liquidsoapのフォルダにcdコマンドで移動して
.\liquidsoap.exe .\test.liq
と打ち込んでエンターキーを押す。

なんかずらずらーーーと出ますがエラーが出たりしてコマンドプロンプトが表示されず
ソースクライアントの接続待ちになれば成功ですヾ(*'∀`*)ノ

うまくいかない場合、output.icecastとinput.harborの両方のパラメータを確認してみましょう。

edcastやnicecastからLiquidsoapに接続してみてIcecastから音がでてくれば成功です~ヾ(´・∀・)ノ


たぶん、LiquidsoapをIcecastサーバ側に入れて処理すればソースクライアント側で何もしなくてもイイんじゃないのかな、とおもうのですが……ウチのVPSがつかってるDebianは
LiquidsoapにMP3エンコーダーが入っていないという……。゚(PД`q*)゚。
(パッケージ設定を変えて再インストールするか、コンフィグ設定をいじって再コンパイルすればよさそうなんですけども)

このLiquidsoap、非常に強力なツールなんですが日本語の解説ページは殆どなく、公式ページの英文ドキュメントもなんだか寂しい状況なので、試行錯誤で挑戦するしかないという、そのへんでハードルは非常に高いのですが……。

ドキュメントを読んだかんじでは、複数の音源ソースを合成したり曲の間にジングルならしたり、ライブでプレイリストを変更したり複数のストリーミングサーバにmp3,mp4,oggと別フォーマットで配信したり、動画にテロップを合成したりと……
edcastのような配信ソースクライアントより明らかに高性能で細かな制御ができそうな感じでした。



ちょっと、仕事でネットラジオ絡みのサイト制作のお手伝いをしたのでSLのほうにも少し反映させてみましたです。

コメント