作業中のメモ

よく「計算機」を使って作業をする.知らなかったことを中心にまとめるつもり.

音声認識による赤外線機器の操作 その 2【辞書作成編】

どうも,筆者です.

前回に引き続き,今回は,Julius で認識用の辞書を作成する.前回までの記事は以下にある.

workspacememory.hatenablog.com

また,以下のサイトを参考にさせていただいた.

Raspberry pi上の音声認識(julius)認識率向上[julius辞書作成] - Qiita

辞書の作成

ここでは,辞書の作成方法について説明する.ただし,単語との 1 対 1 対応がとれる辞書を作成するため,語彙が増えた場合追いつかなくなると思われる. 現状では,認識対象の単語は,さほど数がないため問題ないが,いずれ文法ファイル等を用いた方法に変更する予定である.

今回は,以下の単語を Julius で認識することを考える.表現が微妙に変えてあるのは単語レベルで認識しやすくするためである.

電気つけて
電気オフ
明るくして
暗くして
こだまにして
テレビオン
テレビ切って

単語ファイルの作成

上記のリストを Julius が認識できる形式にするため,単語と読み方の対応を記述する必要がある.これも Julius の追加キットにツールがあるため,ありがたく利用させてもらう.

まずは,作業用ディレクトリに移動する.

~ $ pushd juliusKit

以下のような単語と読み方のファイルを作成し,「word.yomi」として保存する.形式は「単語[タブ]読み方」となる.

電気つけて  でんきつけて
電気オフ    でんきおふ
明るくして あかるくして
暗くして    くらくして
こだまにして  こだまにして
テレビオン てれびおん
テレビ切って  てれびきって

この読み方をローマ字形式に変換する.そのための Shell Script を以下に示す(ファイル名は outYomi.sh とした).

#!/bin/bash
# outYomi.sh

if [ $# -lt 1 ]; then
    echo Usage: $0 "[yomi file]"
    echo "ex) $0 word.yomi"
    exit 1
fi

currentDir=${PWD}
yomiFile=$1
grammarDir=${currentDir}/grammarKit/bin/linux
dictationDir=${currentDir}/dictationKit_v4.3.1
cat ${yomiFile} | iconv -f utf8 -t eucjp | perl ${grammarDir}/yomi2voca.pl > ${dictationDir}/${yomiFile%.*}.dic

ここまでで,juliusKit のディレクトリ構造は以下のようになる.

~/juliusKit
   |--dictationKit_v4.3.1
   |--grammarKit
   |--outYomi.sh
   |--word.yomi

作成した「word.yomi」と「outYomi.sh」を用いて結果を出力する.出力結果は「dictationKit_v4.3.1」以下に出力される.

~/juliusKit $ chmod +x outYomi.sh
~/juliusKit $ ./outYomi.sh word.yomi # dictationKit_v4.3.1/word.dic として保存される

実行結果は以下のようになる.ただ,ファイルは UTF-8 でないため,Linux の場合,そのまま見ると文字化けする.

電気つけて  d e N k i ts u k e t e
電気オフ    d e N k i o f u
明るくして a k a r u k u sh i t e
暗くして    k u r a k u sh i t e
こだまにして  k o d a m a n i sh i t e
テレビオン t e r e b i o N
テレビ切って  t e r e b i k i q t e

Julius 設定ファイルの作成

次に,Julius の設定ファイルを作成する.この辺りから詳しく分かっていない.サンプルを見ながら編集したものとなる.

dictationKit_v4.3.1 以下に「word.jconf」というファイルを作成し,以下の内容を記述する.

~/juliusKit $ pushd dictationKit_v4.3.1
~/juliusKit/dictationKit_v4.3.1 $ touch word.jconf
~/juliusKit/dictationKit_v4.3.1 $ vim word.jconf # エディタは自分の使いやすいものを利用する
# === ここから ===
-w word.dic                               # 単語辞書ファイル
-v model/lang_m/bccwj.60k.htkdic          # N-gram または文法用の単語辞書ファイルを指定
-h model/phone_m/jnas-tri-3k16-gid.binhmm # 使用する HMM 定義ファイル
-hlist model/phone_m/logicalTri           # HMMlist ファイルを指定する
-b 1500                                   # 第 1 パスのビーム幅(ノード数)
-b2 100                                   # 第 2 パスの仮説数ビームの幅(仮説数)
-s 500                                    # 第 2 パスの最大スタック数(仮説数)
-m 10000                                  # 第 2 パスの仮説オーバフローのしきい値
-n 5                                      # n 個の文仮説数が見つかるまで検索を行う
-output 1                                 # 見つかった N-best 候補のうち、結果として出力する個数
-input mic                                # マイク使用
-zmeanframe                               # フレーム単位のDC成分除去を行う(HTKと同処理)
-rejectshort 800                          # 検出された入力が指定時間(msec)以下なら棄却
-lv 3000                                  # 検出された入力の振幅の閾値。範囲内のみの音声を解析対象とする
-charconv EUC-JP UTF-8                    # 入出力エンコード指定(内部:euc-jp、出力:utf-8)
# === ここまで ===

注意することとして,「.jconf」ファイルに記述してあるパスは,「.jconf」があるディレクトリをカレントディレクトリとし,ここからの相対パスで記述されている.そのため,このファイルを移動する場合,パスも一緒に移動するか,対象の定義ファイルをコピーしておく必要がある.

ここまでのディレクトリ構成を以下に示す.

~/juliusKit
   |--dictationKit_v4.3.1
       |--word.dic
       |--word.jconf
   |--grammarKit
   |--outYomi.sh
   |--word.yomi

動作確認

作成した「word.jconf」で動作確認を行う.以下のコマンドを実行し音声を入力すると認識結果が表示される.登録した単語の何れかが表示されるはずである.

~/juliusKit/dictationKit_v4.3.1 $ ALSADEV="plughw:0,0" julius -C word.jconf -demo
# もしくは,~/juliusKit まで戻って,以下を実行
# ALSADEV="plughw:0,0" julius -C ./dictationKit_v4.3.1/word.jconf -demo

余談

気付いたら,「ALSADEV="plughw:0,0"」を指定しなくても動作するようになっていた.これは,途中で再起動したため,設定ファイルがリロードされたためだと思われる.