2013年10月7日

【FHC】音声を非同期再生する & 最新ニュースを喋ってもらう。


久しぶりのFHCネタです。かなり前からやろうと思っていて先延ばしにしていた機能の実装をやっと行いました。

今回はポッドキャストのニュースとして優秀なNHKラジオニュースをFHCを通して喋ってもらうようにしました。



■FHCって何だっけ?

FutureHomeControllerの略で、音声認識で家電の操作をすることができる全く新しいホームガジェットです。

例えば「コンピュータ、エアコンつけて」とFHCに話しかけるだけでエアコンをつけることができます。
iRemoconなどと同じように、赤外線を利用して家電を操作するタイプのホームガジェットです。

ただiRemoconより優れているところとしては、
パソコンやスマートフォンのwebブラウザからも操作できる。
インターネットに接続すれば宅外からでも家電の操作ができる。
Javascriptを利用して自分独自のプログラミングをできる。
と言ったところでしょうか。

FHCはrti技研のrti氏が作成しました。
現在第5次ロットの注文受付中で、この期間内に注文出来なかった場合次回第6次ロットを待たなくてはなりません。
第5次ロットの締め切りは18日まで! 急いで注文だ!(ステマ)
http://rti-giken.jp/




■NHKラジオニュースを再生する

NHKラジオニュースはPodcastでネット配信されています。(URL)

Podcastはxmlで記述された番組リストと、その番組の音声データへのURLが貼られているだけで、要はそのURLを見にいければいい訳です。
FHCにはxmlを解析するのに便利なコマンドも実装されているので、ここは簡単に実装できそうです。


で、問題は、再生するのに必要なプログラムです。
FHCコマンドは、URLからの再生には対応していないので、直接FHC内(Linuxカーネル)にインストールされているプログラムを利用して再生しようと思います。

FHCには、音声を再生するパッケージとしてmpg123とmplayerが入っています。

どちらのプレイヤーもPodcastなどURLからの再生にも対応しているので、どちらを使っても大丈夫だとは思いますが、今回はmpg123を利用しました。




■mpg123をバックグラウンドで再生する

FHCからLinuxカーネル内のプログラムを実行するためにはkernel_execute_localというコマンドを書いて実行します。

kernel_execute_local("mpg123 <podcastのurl>");

これで一応は音声を再生させることができます。
しかしここで音声を再生する際に問題があったのが、非同期で実行することができない点でした。

FHC内のプログラムを実行するコマンドであるkernel_execute_localは、同期処理(プログラムの処理が終わるまで次のコマンドを実行しない)なので、上記コマンドを実行すると、最後まで再生し終わらないとコマンドが終了しません。
しかも実行時間が長すぎるとFHCに「長いんじゃヴォケ」と怒られてしまったりもします。

基本的にLinuxはバックグラウンド再生はコマンドの末尾に「&」をつければバックグラウンド処理になるんですが、mpg123とmplayerともにそれができないみたいです。
面倒ですね。

で、調べたところ、こんな方法がありました。

MPG123フロントエンド作成記

サービスとして実行することでバックグラウンド処理を可能にしているという事みたいです。

これでばっちりバックグラウンドで再生してくれるようになりました。



■会話シナリオを作成する

ここまで来ればあとはもう少しです。
FHCの管理ページから会話シナリオを作成します。

//read_news.js
function main()
{
onvoice("にゅーすを聞かせて" //は
,function(e){
var news_xml = http_get("http://www.nhk.or.jp/r-news/podcast/nhkradionews.xml");
var items_list = html_selector(news_xml, "enclosure");
var url = html_attr(items_list[0], "url");
var command = "start-stop-daemon --start --background --quiet --exec mpg123 -- " + url;
kernel_execute_local(command);
}
)
}

上記をそのままコピペして、保存して実行。

これでラジオを再生することができました。


■問題点

ポッドキャストの再生をすることが可能になりましたが、ここでまた一つ問題。
音声の再生をしているので途中で中断するための処理が音声認識でできません。
(前も同じ事書いたような気も……)

これにかんしては、まぁまた気分が向いた時にでもどうにかしようと思います。することができたらだけど。