Kazoo04でJulius入門
みなさんこんにちは。この記事はkazoo04 Advent Calendarの20日目の記事となります。お手柔らかにお願いいたします。
はじめに
さて、みなさん突然ですが、TwitterのTimeLineで「かずーーーー氏ーーーーー!!!!」とツイートしている人を見たことはないでしょうか。きっと多くの人がかずー氏への愛(ここでの愛は敬愛などの愛を指します)の叫び、もといツイートを見たことがあるでしょう。誰が叫んでるとは言いませんが。言いませんが。
かずー氏かずー氏かずー氏かずー氏かずー氏かずー氏かずー氏かずー氏かずー氏かずー氏かずー氏かずー氏かずー氏かずー氏かずー氏かずー氏かzうーしかずー氏かジーしかズーしかズーしかずs-イズかずー氏かずー氏かずー氏かずー氏かずー氏かずー氏数s-行かずs-イズかずー氏かずー氏かずー氏数
— くろてい@年賀状交換はリプ (@blacktails2) 2013, 7月 30
(最近は言ってないとのことです。確かに言われてみればそうですね。)
ところで、みなさんこんな風に思ったことはありませんか?
「かずー氏!って叫んだら本当にかずー氏が現れればいいのに....」
生憎(?)僕はそこまで追い詰められたことはありませんが、世の中にいるかずー氏クラスタと呼ばれる皆さん(の一部の方)は思ったことがあるのではないでしょうか。せめてかずー氏にすぐにリプライを送れるようにクライアントが起動してくれればいいのに、と思ったことがある方もいるかもしれません。
このような「音声によってソフトウェアを操作する」(かずー氏はソフトウェアではありません、念のため)時にかならず必要な技術となるのが、「音声認識」です。今回は、この音声認識についての話とそれをしやすくするツールの話をしていきたいと思います。
ここからは結構真面目な記事になると思います。っていうか正直な話ここからあとかずー氏ほとんど出てきません。すみません....
Julius
音声認識のシステムを一からすべて自分で作るのは非常に難しいことです。音声認識はただ入力された音声をそのまま解析するだけではありません。様々な工程を経て認識システムとして成立するわけですね。
じゃあ実際に僕らが「音声認識がしたい」と考えたときに、その複雑なシステムを自分で実装しなければならないかといわれるとそうではありません。世の中には私たちが音声認識を学ぶ時にとても便利なものがあります。それがJuliusです。
Juliusとは、大語彙連続音声認識エンジンといって音声を認識してくれるソフトウェアです。オープンソースソフトウェアであり、商用利用も可能となっています。また、言語モデルと音響モデルを差し替えることによって、場面に合わせた利用も可能です。
ここまで文ばかりでつまらないので、ちょっと利用してみましょう。
Juliusをwindowsにインストールする
今回は試すだけ、という形なので、必要なものだけをダウンロードしていきます。
- Juliusを利用するときに必要なディクテーション実行キットというものをダウンロードします。 Juliusディクテーション実行キットから、Windows版 DNN版Juliusディクテーション実行キットを選択してください。ダウンロードが開始します。
- ダウンロードしたzipファイルを適当なところに展開してください。
- 展開した先にあるrun.batを実行すれば、さっそく音声認識がスタートします!
こちらは僕がrun.batを実行して、「こんにちは かずー氏(×3)」と話しかけた結果です。
かずー氏という言葉がJuliusの言語モデルと言われるものに記述されていないため、かずー氏という言葉は認識されていませんが、それでもそれに近いものが表示されていますね。
Juliusのここが凄い
音響モデルと言語モデルと認識システムが独立している
世の中に出ているフリーではない音声認識ソフトウェアは、音響モデルと言語モデルと認識システムがすべて一つになってしまっていますが、Juliusの場合は変更が可能です。そのため、その場にあわせた認識が可能となります。
記述文法が使える
Juliusでは、認識用の記述文法を用いた認識を行うことができます。これによって、ルール化しやすいものを認識しやすくなります。
認識用文法は、以下の二種類のファイルによって記述することができます。
- grammar ファイル
- voca ファイル
grammarファイルは単語がどのようにつながっていくか、ということについて記述します。
#fruit.grammar S : NS_B FRUIT_N PLEASE NS_E # 果物名(+数量) FRUIT_N : FRUIT FRUIT_N : FRUIT NUM KO # ください/にしてください/です PLEASE : WO KUDASAI PLEASE : NISHITE KUDASAI PLEASE : DESU
vocaファイルはgrammarファイルに記述した単語カテゴリに属する言葉を登録するためのファイルです。
#fruit.voca % FRUIT 蜜柑 m i k a N リンゴ r i N g o ぶどう b u d o: % NUM 0 z e r o 1 i ch i 2 n i: 3 s a N 4 y o N 5 g o: 6 r o k u 7 n a n a 7 sh i ch i 8 h a ch i 9 ky u: % KO 個 k o % WO を o % KUDASAI ください k u d a s a i % NISHITE にして n i sh i t e % DESU です d e s u % NS_B <s> silB % NS_E </s> silE
例えば、この用になっている場合は
- りんごをください
- 蜜柑3こにしてください
というような文がマッチする文法ができた、ということになります。
このファイルをmkdfa.plを使ってコンパイルし、juliusの実行時のオプションに指定すれば、この文法条件を満たすものを認識してくれます。
詳しい説明が知りたい方は、Juliusbook 第七章 言語モデル 記述文法のところを参考にしてください。
オープンソースライセンス
JuliusはOSSなので、個人で自由に改良を加えることが可能です。
Juliusモジュールモード
できるなら、このJuliusの解析結果をプログラム側から使いたいですよね。そんな時に便利なのがモジュールモードです。
どう実行するかというと、juliusの実行時のオプションに -module を追加するだけです。
こうすることで、Juliusの解析結果をソケット経由で受け取ることが可能となります。ちなみに-moduleのあとに数字を追加することでポート番号を指定する事ができます。デフォルトは10500番です。
ここでRubyで簡単に受信する時のサンプルプログラムを貼っておきます。
Juliusのここがつらい!
ここまでJuliusすごい!!みたいな話をしてきましたが、ちょっとこれだけだと不公平(?)な気がするのでちょっとつらい部分も話していきたいと思います。
readmeのエンコードが尽くShift-JIS
LinuxでJuliusをいじっている時、僕は一体何回iconvコマンドを打ったことでしょう...まあエディター側で指定すれば良いのでしょうが、つらいものを感じました。
情報がバラバラ過ぎ
情報を集めるのが結構苦痛です。まあ大体はjuliusbookというのに載っていたりはしますが。ググり力アップ間違いなし!!
サーバーモードで送られてくるXMLが謎だったりする
詳しくはこちらのエントリーをお読みください。
最後に
なんだか最後までまとまりのないエントリーになってしまいました。最初は音声認識の基本みたいな記事も書きたかったのですが、理解が及ばないのと時間が足りないのとで、今度この記事に追記させていただくつもりです。すみません...
かずー氏にはとてもお世話になっています。これからもよろしくお願い致します。
最後にJuliusを批判しておいてなんですが、私はJuliusはとても優れたツールだと思っています。皆さんも興味があったらぜひ使ってみてください。