続・Juliusを使った音声認識システムの作成 | ソフトウェア開発のギークフィード

Juliusを使った音声認識システムの作成【完成版】

こんにちは。久々の投稿となります。
以前Juliusを使った音声認識システムの作成という内容で記事を書いており、
その際後半は次回でと言いつつ、かなり間が空いてしまいました(笑)。

 

前回の記事にて途中まで(juliusインストールから単体での起動)しか記載していませんでしたので、今回はその後半として、実際に音声をサーバにアップし、その音声をjuliusにて認識、結果をブラウザ画面に表示させるまでを記載していきます。

 

 

また、サーバ処理はNode.JSで記述しております。

 

画面上から音声をアップし解析結果を表示させたい

やりたかったのは、ブラウザ画面から音声をアップロードし、それを解析した結果を画面上に表示させることでした。

 

Juliusは起動時にオプションを指定することで、音声データの入力方法を指定することが可能です。
以下の方法から選択が可能となっています。

 

入力方法

  • 音声波形入力(基本フォーマット)
  • ファイル入力(-input rawfile)
  • 録音デバイスからの直接入力(-input mic)
  • ネットワーク・ソケット経由の入力(-input adinnet)
  • 特徴量ファイル入力(-input htkparam,-input mfcfile)

 

今回はこのオプションにてファイル入力を指定し、出力した結果を取得しブラウザ画面上の結果エリアに表示させることにしました。

 

音声アップロード処理の実装

音声アップロードについては、インターフェースを作成し、ファイルアップロード処理を行った際にサーバ側にてリクエストを受け取った後、サーバ内の「/home/user/voicefile」のディレクトリ配下に格納されるようにしました。

以下ではサーバにてリクエストを受け取ってから格納までの処理を記述しています。

 

ちなみに、音声は以下の形式でないとJuliusが認識してくれないので注意。

  • .wavファイル:
    Microsoft WAVE形式 WAVファイル(16bit, 無圧縮PCM, monoral のみ)
  • ヘッダ無しRAWファイル:データ形式は signed short (16bit),Big Endian, monoral

 

ここまでできたら/home/user/voicefile/voice3.wavを対象の音声ファイルとし、juliusを起動させます。

Juliusでの音声認識

クライアントにて「音声認識」ボタンを押下後、それを受け取ったサーバ側でJuliusを起動させ、アップロードした音声ファイルを対象に音声認識を開始します。
(他にもっといい方法がありそうな気もしますが、)今回は起動コマンドを直接実行する方法で行いました。

 

※Juliusにはmoduleモードというものがあり、最初はmoduleモードで起動させようとしたのですが、moduleモードの場合多重起動できず、複数の画面で起動させた場合にうまくいかなくなる為標準入力にて実行するやり方に変更しました。

 

Julius起動のコマンドのオプションについては以下の通りとなります。

 

-input rawfile 音声入力方法をファイルに指定
-cutsilence ファイル内の音声をいったんマイク入力と同じ基準で(長時間の無音ごとに)切り出し,その切り出しごとに処理を行う
-realtime マイク入力と同様に入力と認識を並列処理する
-nostrip 音声波形中の振幅 が “0” となるフレームを除去するが、うまく動かない場合このオプションを指定することで自動消去を 無効化することができる(らしい)
※これつけないと認識時にwarningがたくさん出力されたのでオプション指定してます

 

Julius起動後、対象となる音声ファイルを標準入力にて指定します。
そうすることで標準出力にて結果が表示されますが、以下のような形で結果が出力される為、結果を加工して実際の認識結果箇所のみに抽出する必要があります。

 

pass1_bestは、中間認識結果で、最終的な結果としてはsentence1に表示されます。
なので、sentence1の結果のみ切り出してresultdataとしてクライアントに返却しています。

 

ちなみに相変わらずの認識率についてはご愛敬ということで(笑)

結果の表示

結果を画面上に表示します。

 

ここで一つ問題がありました。Julius起動時のオプションとして「-cutsilence」を指定している為、返却される結果はセンテンス毎に送られてきます。その為、どのタイミングで認識終了なのかがわかりませんでした。
そしてブラウザ上では認識実施中は「認識開始」ボタンをdisableにしており、完了後に解除するという仕様を想定していたので、この状態では解除するタイミングがわかりません。

 

それを解決する為に、結果受信時にタイマーを起動し、15秒経っても次の結果が送られてこなかった場合に認識完了とすることとしました。

 

また、以下の処理にてサーバから取得した認識結果を画面上のテキストボックスに表示させます。

 

ちなみに今回はブラウザ画面上にキーワードを10個まで入力可能にしており、認識結果にそのキーワードが含まれていた場合、ハイライトを付ける処理を含めておりました。
今回の記事の趣旨とは逸れる為ここでは詳細を省いておりますが、結果表示においてこの処理も行っている為、それも含めた処理を以下に記述しております。

 

markCompAreaというテキストボックスが結果表示欄となる為、これで結果が画面上に表示されます。

 

Juliusで音声認識システムを作ってみて

Juliusを使って音声認識させるという記事は探せばいろいろあったのですが、自分がやりたい事に対してピンポイントでマッチするようなものはなかったので模索しながら実施しました。

 

とりあえずできるようになることを優先に進めていたので、一応こういう方法でもできますよという感じで参考にしてもらえればと思います。
juliusは初めて触ったのですが、自サーバ内に構築可能なので、外部に接続せずとも使えるというところはいいですね。

 

ちなみに今回認識精度についてはあまり気にしていなかったのですが、Juliusの場合は辞書の内容によってかなり認識精度変わってくるようなので、使用する辞書によっては精度がかなり上がってくるのではないかと思います。

この記事が気に入ったら
いいね ! しよう

Twitter で
The following two tabs change content below.
アバター
髙橋 千紘
エンジニア
プログラミング開発できるエンジニアを目指し勉強中の身です。 今までは要件定義、仕様調整等、上流工程をメインとした仕事をしていました。

【求人】私たちと一緒に働きませんか?

採用情報
ページトップへ