音声認識とは
音声認識してみたいです。
このような要望にお応えします。
音声認識の基本的な処理手順について整理してみます。
音声認識では、音声波形が入力されたとき、その音情報を文字列として変換して出力することを目指します。
入力の音声波形から特徴抽出を行い、特徴量ベクトルの時系列を抽出します。この入力の特徴量ベクトル系列をXとするとき、与えられたモデルのもとで最も出現確率が高い単語列Wを算出します。このとき、音響モデル、言語モデルを使用します。
特徴量は、音声波形データを高速フーリエ変換を用いて周波数データに変換し、そこから機械が認識可能な形で特徴抽出を行います。
音響モデル、言語モデルとは何でしょうか?
“音声の音響的な特徴と言語的な特徴を分離して扱うことが多い。音響的な特徴とは、認識対象の音素がそれぞれどのような周波数特性を持っているかを表したもので、音響モデルと呼ばれる。音響モデルの表現としては、混合正規分布を出力確率とした隠れマルコフモデルが広く用いられている。言語的な特徴とは、音素の並び方に関する制約を表したもので、言語モデルと呼ばれる。例えば、「あなた (a n a t a)」という発声の直後には、「が (g a)」や「は (w a)」などの発声が続く確率が高い、などの制約である。言語モデルの表現としては、認識対象の言語が大規模な場合(パソコン上での文書作成など)はn-gramが良く用いられる。”
(wikipediaより抜粋: https://ja.wikipedia.org/wiki/%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98)
音声認識ツールの準備
今回は、音声認識を行うためにjuliusを使用します。
juliusは、京都大学や名古屋工業大学の研究室が開発しているオープンソースの音声認識ライブラリです。
- http://julius.osdn.jp/paper/hi200902-julius-development.pdf
- http://julius.osdn.jp/index.php?q=grammar-kit.html
それでは、juliusによる音声認識を行い、Pythonを使用して音声認識結果を確認してみます。実行環境は、windows 10, Python 3.x系でコマンドプロンプトを使用しました。
juliusの音声認識パッケージ一式として、下記のページから「ディクテーション実行キット」をダウンロードしました。
- http://julius.osdn.jp/index.php?q=dictation-kit.html
juliusは単独で使用することもできますが、今回はPython経由で音声認識結果を確認したいと思いますので、モジュールモードで使用したいと思います。
juliusのモジュールモードでは、コマンド実行時に’-module’をつけて起動することで音声認識サーバとして起動させることができます。
ダウンロードしたディクテーション実行キットを任意の場所で展開します。
次にコマンドプロンプトを実行し、ディクテーション実行キットまでcdコマンドを使用して移動します。移行後、下記のコマンドを実行することでjuliusをモジュールモードで起動することができます。
1 |
bin\windows\julius.exe -C main.jconf -C am-dnn.jconf -module -charconv utf-8 sjis -dnnconf julius.dnnconf |
コマンドを実行するとjuliusサーバのポート番号が表示されますので、このポート番号を使用して、Pythonプログラムで通信制御を行い音声認識結果を表示しようと思います。
1 2 3 4 5 6 |
Stat: server-client: socket ready as server /////////////////////////////// /// Module mode ready /// waiting client at 10500 /////////////////////////////// /// Stat: server-client: connect from 127.0.0.1 |
Python側の通信制御プログラムは以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import socket import re import time def fn_voice_recog(): host = '127.0.0.1' # IPアドレス port = 10500 # Juliusとの通信用ポート番号 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #juliusサーバに接続 client.connect((host, port)) time.sleep(3) re_word = re.compile('WORD="([^"]+)"') data = "" try: while True: while(data.find("</RECOGOUT>\n.") == -1): data += str(client.recv(1024).decode('shift_jis')) recog_text = "" # 単語を抽出 for word in filter(bool, re_word.findall(data)): recog_text += word print("認識結果: " + recog_text) data = "" except KeyboardInterrupt: print('PROCESS END') client.send("DIE".encode('utf-8')) client.close() if __name__ == '__main__': fn_voice_recog() |
出力結果
出力結果の一部を載せます。
1 2 3 4 |
認識結果: うーん。 認識結果: 方法は。 認識結果: こんにちは。 PROCESS END |
以下を参考にさせていただきました。
- http://julius.osdn.jp/paper/hi200902-julius-development.pdf
- http://julius.osdn.jp/index.php?q=grammar-kit.html
- https://techacademy.jp/magazine/26032
- https://gist.github.com/ikegami-yukino/a22d57f2b2935264da4a17f8e840cc96
- https://ja.wikipedia.org/wiki/%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98