MozillaのDeepSpeechで日本語音声認識エンジンを作る 〜ひらがなわかち書きで言語モデル〜

公開日:2019-03-13
最終更新:2019-03-13

前回10086件のデータを使って平仮名のみで言語モデルを使わない音声認識エンジンをトレーニングしてみました。

詳細はこちら、性能は全然ですがこちらで性能もチェックできます。

平仮名のみ、言語モデルなしというのは、インプットとして音声データ、アウトプットとして平仮名の羅列を使い、言語そのものは考慮しなかったという意味です。

例えば、人間であれば、何かお礼を言われる文脈であれば、音声としては「あいあと」みたいな発音だったとしても「ありがとう」と認識できます。これは言語(以後言語モデルと呼びます)が頭に入っているからなのですが、前回トレーニングしたモデルは言語モデルを考慮していないので、例えば「あいあと」は「あいあと」としてしか認識できません。

モデルのイメージとしてはこんな感じです。

alphabet.txtというのはDeepSpeechが予測に使える文字のリストで、この中にとかが入っているので、とかを使った文字の羅列を予測できます。

ところで、前回のトレーニング時に僕は言語モデルを使わなかったのですが、実を言うとDeepSpeechは言語モデルを使うことを前提としたアプリケーションです。

言語モデルを使って音声認識エンジンを作る場合のイメージは以下のような感じです。

KenLMという比較的シンプルで高速に動く言語モデル生成エンジンを使い、事前に言語モデルを作成します。図の中ではlm.binaryとなっています。

DeepSpeechで言語モデルを使うにはlm.binaryを元にtrieというファイルを作成し、DeepSpeechに渡してやる必要があります。
このtrieが何をしているのか、なぜ必要なのかに関しては、きちんと理解しているとは言い難いのですが、言語モデルを元によりもっともらしい言葉を見つける時に使われているものと思われます。

ということで、日本語向けにも試してみました。

KenLMを使って日本語の言語モデルを作るにはどうしたら良いのか?
言語モデルを搭載した場合、alphabet.txtは言語モデル無しのときと同じもので良いのか?
など、僕ではすぐには正解がわからないことだらけでしたらが、まずはやってみましょう。

今回は漢字やカタカナを含めない平仮名と英数字のみで実験をすることにしました。
イメージとしてはこんな感じです。

まずはKenLMを使って言語モデルを作成します。

KenLMに投入するデータセット(図のsentence.txt)はソツーにて読み上げて頂いたテキストとウィキペディアからランダムに抽出した文章を混ぜて準備しました。

フォーマットとしては

べつに さまたげ が なく とも  
それほど おそく めざめる という よう な ことは なかっ たろ う  
さいしょ の きかいしきけいさんき の かいはつ をおこなっ た  
すうがく げんり を しゅっぱん し

のような感じで、平仮名、英語、数字のみを使い、分かち書きを行いました。
alphabet.txtには平仮名に加え、スペース、所謂英語のアルファベット、数字を追加しました。

今回用意したデータセットには数字とアルファベットは実際には入っていなかったので、alphabet.txtにアルファベットと数字を追加したのは余計だったかもしれませんが、これはまた別の話。

その後、以下のコマンドを実行し、言語モデルを生成しました。
コマンドが2行になっているのは1行目で言語モデル(テキストベースで?)を生成し、2行目でそれをバイナリに変換しているからです。言語モデルの名前はsotuu_kanaeisu_lm.binaryとしました。

lmplz --order 5 --temp_prefix /tmp/ --memory 80% --text all_eisu_sentences.txt --arpa ./results/sotuu_kanaeisu.arpa  
build_binary -a 255 -q 8 trie ./results/sotuu_kanaeisu.arpa ./results/sotuu_kanaeisu_lm.binary

さらにその後、tensorflowに付属のgenerate_trieというコマンドで、trieファイルを生成しました。ここではsotuu_kanaeisu.trieという名前にしています。

generate_trie alphabet_kanaeisu.txt ./results/sotuu_kanaeisu_lm.binary ./results/sotuu_kanaeisu.trie

実はgenerate_trieがなかなか見つからず、ここでちょっと手こずってしまいました。どこかからダウンロードしてそのまま使えるものもあるっぽいのですが、今回はdeepSpeechの指示に従ってtensorflowのソースコードをコンパイルして作成しました。

これで、言語モデル搭載音声認識エンジンをトレーニングする材料が揃いました。
今回のデータセットは前回からちょっと増えて10529件です。

前回使ったトレーング用のスクリプトをほんの少しだけ書き換えます。

#!/bin/sh  
set -xe  
if [ ! -f DeepSpeech.py ]; then  
    echo "Please make sure you run this from DeepSpeech's top level directory."  
    exit 1  
fi;  

python -u DeepSpeech.py \  
  --train_files data/sotuu/train_corpus_kanaeisu.csv \  
  --dev_files data/sotuu/valid_corpus_kanaeisu.csv \  
  --test_files data/sotuu/test_corpus_kanaeisu.csv \  
  --train_batch_size 20 \  
  --dev_batch_size 20 \  
  --test_batch_size 20 \  
  --n_hidden 494 \  
  --epoch 30 \  
  --alphabet_config_path 'data/alphabet_kanaeisu.txt' \  
  --checkpoint_dir "sotuu_checkpoint" \  
  --export_dir "sotuu_export" \  
  --lm_binary_path 'data/lm/sotuu_kanaeisu_lm.binary' \  
  --lm_trie_path 'data/lm/sotuu_kanaeisu.trie' \  
  "[email protected]"

いざトレーニング。
僕のちょっと古いMacbook proで大体15時間くらいかかりました。

Training epoc30でlossが18です。
テスト時のWERは0.6〜1.5です。
loss自体が前回より上がっているのが気になりますが、前回は意味のない文字の羅列でテストが行われていたことを考えるとこちらの方がまっとうな気がします。

今回のログはこちらです。

出来上がったモデルのクオリティはこちらのビルド2で試すことができます。

データの絶対量もまだまだなので、クオリティもまだまだですね。

次回はalphabet.txtに漢字も投入して一気にかな漢字混じりの文章を予測させてみたいと思っています。
中国の方が漢字をalphabet.txtに入れて(英語のアフラベットにあたる文字数が6000以上?!)トレーニングをされていたので、こちらが正解なのかもしれませんね。

ところで、トレーニングはソツーにて読み上げて頂いた音声データを使っています。

「んっ」と思った方は是非、ご意見、アドバイスを頂けないでしょうか。

プロジェクト自体もまだ卵(ヒヨコにもなってないかも)の状態で、技術的なことに関するアドバイスもプロジェクトそのものに関するアドバイスも大歓迎です。

記事が少しでもいいなと思ったらクラップを送ってみよう!
19
+1
@kouohhashiの技術ブログです。 主にAI、特に会話AIについて記事を書こうと思っています。

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする