Julius を使った音声認識

提供: VoIP-Info.jp
2009年11月6日 (金) 15:30時点におけるKonishi (トーク | 投稿記録)による版 (Asterisk 1.6.1 に対応したので、更新)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

Asterisk で音声認識

Asterisk と Julius を連携させて、音声認識を実現する。
なお、以下の番号で山手線の駅名を認識するデモを用意してあります。

055-287-7709

更新履歴

  • Asterisk 1.6.1 系対応。(2009/11/6)

材料

  • 必ず必要なもの
  • デモ環境
このデモでは、音声合成に galatea talk + unidic を利用しています。

環境の構築

  • 期待するディレクトリ構成
/root
|-- work
|   |-- dictation-kit-v3.2
|   |   `-- model
|   |       `-- phone_m
|   `-- julius-4.1.2
|       `-- plugin
|-- jr
`-- yui
  • 事前準備
    • /root/work ディレクトリの準備
    # mkdir /root/work
    
    • ソースの取得
    # cd /root/work
    # wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-1.4.26.3.tar.gz
    # w3m http://sourceforge.jp/projects/julius/downloads/37582/julius-4.1.2.tar.gz/
    # w3m http://prdownloads.sourceforge.jp/julius/28977/dictation-kit-v3.2.tar.gz
    # wget http://www2.iweave.jp/asterisk-julius/asterisk-julius-20091106.tgz
    # wget http://www2.iweave.jp/asterisk-julius/asterisk-julius-20091006-jr.tgz
    # wget http://www2.iweave.jp/asterisk-julius/asterisk-julius-20091006-yui.tgz
    
  • Julius ビルド
    • /root/work に julius-4.1.2.tar.gz を展開する。
    # cd /root/work
    # tar zxf julius-4.1.2.tar.gz
    
    • julius/Makefile.in の LDFLAGS の定義の最後に -rdynamic を追加する。
    # cd julius-4.1.2
    # sed 's/^\(LDFLAGS=.*\)/\1 -rdynamic/' julius/Makefile.in > julius/Makefile.in.temp
    # mv julius/Makefile.in.temp julius/Makefile.in
    
    • ビルド&インストール
    # ./configure
    # make
    # make install
    
    • 参考ページ
    http://julius.sourceforge.jp/juliusbook/ja/desc_install.html#id2486532
  • Julius プラグインビルド
    • /root/work に asterisk-julius-20091106.tgz を展開する。
    # cd /root/work
    # tar zxf asterisk-julius-20091106.tgz
    
    • ソースを Julius のディレクトリにコピーする。
    # cp asterisk-julius/udpadin.c julius-4.1.2/plugin
    
    • プラグインをビルドする。
    # cd julius-4.1.2/plugin
    # gcc -shared -o udpadin.jpi udpadin.c
    
  • 音響モデルの用意
    • /root/work に dictation-kit-v3.2.tar.gz を展開する。
    ビルド作業はありません。
    # cd /root/work
    # tar zxf dictation-kit-v3.2.tar.gz
    
  • Asterisk 連携アプリケーションのビルド(Asterisk 1.4 系の場合)
    • /root/work に Asterisk 1.4 系のソースを展開する。
    # cd /root/work
    # tar zxf asterisk-1.4.*.tar.gz
    
    • /root/work に asterisk-julius-20091106.tgz を展開する(展開していない場合)。
    # tar zxf asterisk-julius-20091106.tgz
    
    • app_talkdetect.c にパッチを当てる。
    # cd asterisk-1.4.*
    # patch -p1 < ../asterisk-julius/app_talkdetect-julius.patch
    
    • Asterisk のビルドオプションを選択、ビルドして、インストールする。
    # ./configure
    # make menuconfig
    # make
    # make install
    # make samples
    # make config
    
    • /etc/asterisk/sip.conf 等を編集して、電話機を登録する。
    • すでにビルド環境がある場合は、その環境に app_talkdetect.c をコピーして、再ビルド&インストールしてください。
  • Asterisk 連携アプリケーションのビルド(Asterisk 1.6.1 系の場合)
    • Asterisk 1.4 系の手順に準じる。
    • ただし、パッチファイルとして app_talkdetect-julius.patch-1.6 を利用する。

デモ環境構築

  • 山手線の駅名の認識デモ
    • /root に asterisk-julius-20091006-jr.tgz を展開する。
    # cd /root
    # tar zxf work/asterisk-julius-20091006-jr.tgz
    
    • /root/work に asterisk-julius-20091106.tgz を展開する(展開していない場合)。
    # cd /root/work
    # tar zxf asterisk-julius-20091106.tgz
    
    • 番号計画をコピーする(Asterisk 1.4 系の場合)。
    # cp /root/work/asterisk-julius/extensions.ael /etc/asterisk
    
    • 番号計画をコピーする(Asterisk 1.6.1 系の場合)。
    # cp /root/work/asterisk-julius/extensions.ael-1.6 /etc/asterisk/extensions.ael
    
    • default コンテキストの 200 番でデモが利用できる。
  • OSC 2009 Okinawa で使ったデモ
    • /root に asterisk-julius-20091006-yui.tgz を展開する。
    # cd /root
    # tar zxf work/asterisk-julius-20091006-yui.tgz
    
    • /root/work に asterisk-julius-20091106.tgz を展開する(展開していない場合)。
    # cd /root/work
    # tar zxf asterisk-julius-20091106.tgz
    
    • 番号計画をコピーする(コピーしていない場合、Asterisk 1.4 系の場合)。
    # cp /root/work/asterisk-julius/extensions.ael /etc/asterisk
    
    * 番号計画をコピーする(コピーしていない場合、Asterisk 1.6.1 系の場合)。
    # cp /root/work/asterisk-julius/extensions.ael-1.6 /etc/asterisk/extensions.ael
    
    • default コンテキストの 201 番でデモが利用できる。

デモの実行

  • 山手線の駅名の認識デモ
    • Asterisk を再起動する。
    # /etc/init.d/asterisk restart
    

    あるいは

    # /etc/rc.d/init.d/asterisk restart
    
    • Julius を起動する。
    # cd /root
    # julius -C jr/jconf-jr
    
    • 接続している電話機から 200 番をダイアルする。
  • OSC 2009 Okinawa で使ったデモ
ゆいレールの駅名を認識します。
    • Asterisk を再起動する。
    # /etc/init.d/asterisk restart
    

    あるいは

    # /etc/rc.d/init.d/asterisk restart
    
    • Julius を起動する。
    # cd /root
    # julius -C yui/jconf-yui
    
    • 接続している電話機から 201 番をダイアルする。
    • ゆいレールの情報はこちらで確認下さい。
    右側に駅名が記載されています。
    http://www.yui-rail.co.jp/

利用方法

  • Julius の設定
    • plugindir
    プラグインが存在するディレクトリを指定する。
    • input
    音源の指定。Asterisk 連携では udpadin を指定する。
    • udpport
    Astersik 連携のポートを指定する(オプション)
    • 設定ファイルの例(該当部分のみ抜粋)
    -plugindir /root/work/julius-4.1.2/plugin
    -input udpadin
    -udpport 12346
    
  • Julius の辞書
    • 認識した結果(単語)が、そのまま、Asterisk に通知される。
    • 例えば、数字(英数字)にすると、番号計画の中で利用しやすくなる。
  • 番号計画での利用方法
    • 認識させる
      • チャネル変数 JULIUS_PORT に julius 連携用の UDP ポートを指定する。(オプション)
      • アプリケーション BackgroundDetect に、プロンプトを指定して、実行する。
      プロンプトには、認識させたい時間分の無音部分を音声後に含ませる。
    • 認識結果を利用する
      • 単語を認識したときは、talk エクステンションに goto する。
      • 認識した単語は、チャネル変数 JULIUS_RECOG にセットされる。

制限

  • 音声認識は、同時に1チャネルのみ利用可能です。
複数チャネルで利用した場合は、正しい結果を得ることができません。
  • 登録されていない単語に対しても、常に登録した単語として認識してしまいます。
  • 騒がしい環境で利用すると、ノイズを音声とみなし、登録した単語として誤認識します。

その他

以下につきましては、iWeave 小西(直通電話番号 055-244-7663)までお問い合わせ下さい。

  • 電話用音響モデル
  • 複数チャネル同時認識対応
  • 複数文法対応
  • 環境ノイズ対応(環境ノイズを誤認識しないように)
  • システム構築、技術支援など

備考

  • 音声認識 Julius のページ
http://julius.sourceforge.jp/
  • 音声合成 galatea talk のページ
http://www.sp.nitech.ac.jp/~demo/gtalk/demo.php
http://sourceforge.jp/projects/galateatalk/
  • 形態素解析辞書 unidic のページ
http://www.tokuteicorpus.jp/dist/

補足ファイル

  • 山手線音声ファイル AqesTalk版
http://ftp.voip-info.jp/asterisk/sounds/misc/jr-aqt.zip
上記のデモ環境の音声ファイルと交換して使用できます。