目次
はじめに
近年、AI技術の登場により、画像認識や自然言語処理など多くの分野で、目覚ましい進展がみられていることは、みなさんもご存じだと思います。その1つである「音声認識」に関しても、認識精度が飛躍的に向上しています。
そして、その「音声認識」を実現するためのツールも数多く公開されており、簡単に試すことができるようになっています。今回はその中からいくつかピックアップし、自分の声を録音したデータに対して、どれくらいの認識精度なのか見ていきたいと思います。
ツール1:Julius
Juliusとは
Juliusは、京都大学等が研究・開発に関わっている、フリーで使える高性能な音声認識ソフトウェアです。汎用性・可搬性が高いことが特徴で、音声認識のモジュール(音響モデル、言語モデル、発音辞書等)を組み替えることで、様々な用途に使うことができます。
導入方法
今回は簡単に導入するために、Google Colaboratory上でJuliusの導入を試みたいと思います。(Google Colaboratoryの導入方法については、ここでは割愛します。)
【環境】
- Google Colaboratory
- Python 3.7.12
ソースコードのダウンロードとコンパイル
では、まず最初にGitHubリリースページからJuliusをダウンロードします。
※2021年10月13日 現在、最新版はJulius-4.6ですが、今回はJulius-4.5の方を使います。
ダウンロード後、Juliusをコンパイルする必要があるのですが、コンパイル時にいくつかオプションを設定することができます。ここではアルゴリズムチューニングとして、精度を特に重視した「standard(標準版)」を選択してみます。デフォルトでは、速度と精度のバランスを取った「fast(高速版)」が設定されています。
※Julius は実行バイナリのみで動作するため、システムへのインストールは必須ではありません。
1 2 3 4 5 6 7 |
%%bash wget --trust-server-names https://github.com/julius-speech/julius/archive/refs/tags/v4.5.tar.gz tar zxvf v4.5 cd julius-4.5/ ./configure --enable-setup=standard make |
音声認識パッケージ(ディクテーションキット)のダウンロード
続いて、Juliusをとりあえず動かすために使える、Julius音声認識パッケージというものが提供されているので、そちらをダウンロードします。ディクテーションキット(dictation-kit)、話し言葉モデルキット(ssr-kit)、講演音声モデルキット(lsr-kit)の3つが公開されていますが、今回はその中でも一般的なモデルであるディクテーションキットを使います。
※2021年10月13日 現在の最新版であるdictation-kit-4.5を使います。
1 2 3 4 |
%%bash wget --trust-server-names "https://osdn.net/frs/redir.php?m=gigenet&f=julius%2F71011%2Fdictation-kit-4.5.zip" unzip dictation-kit-4.5.zip |
これでJuliusの導入は完了です。
精度確認
それでは早速、認識させてみたいと思います。認識できる音声ファイルにはいくつか制限があるので、注意が必要です。フリーソフトのffmpeg等を使って以下の形式に変換しておくと良いです。
- チャンネル数:1チャンネル(モノラル)
- サンプリングレート:16,000 Hz
- ファイル形式:.wavファイル、ヘッダなしRAWファイル
実行時にはいくつかオプションも設定できます。
【オプション例】
- -C:読み込むjconf設定ファイルを指定する。
- -dnnconf:読み込むdnnconfファイルを指定する。
- -input:音声入力ソースを選択する。(音声波形ファイルの場合は、file or rawfileを指定する。)
- -cutsilence:レベルと零交差による入力検知を行うかどうかを指定する。
長時間録音された音声ファイルに対して音声区間検出を行いながら認識できる。
その他、詳細は下記ドキュメントから確認してください。
実行コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import subprocess from subprocess import PIPE julius = "{Juliusのパス}" main = "{dictation-kit内のmain.jconfのパス}" am_dnn = "{dictation-kit-4.5内のam-dnn.jconfのパス}" julius_dnn = "{dictation-kit-4.5内のjulius.dnnconfのパス}" input_audio_file = "{音声ファイル名}" args = [julius, "-C", main, "-C", am_dnn, "-dnnconf", julius_dnn, "-input", "rawfile", "-cutsilence"] p = subprocess.run(args, stdout=PIPE, input=input_audio_file, text=True) print(p.stdout) |

最終的な認識結果は、sentence1に出力されています。今回は下記3つの音声データに対して、認識を行ってみました。
音声データ | 認識結果(Julius) |
こんにちは |
こんにちは 。 |
これから打ち合わせを始めます |
これ から 打ち合わせ を 始め ます 。 |
趣味はYouTubeの動画を観ることです |
趣味 は 冬 中 黒 丘 を 見る こと です 。 |
辞書に単語を追加
当然のことながら、発音辞書に登録されていない単語はうまく認識ができません。では、先程認識できなかった単語を辞書に追加してみましょう。本来は別途モデルや辞書を用意しておくべきですが、今回はdictation-kit内の発音辞書をそのまま使ってみます。
dictation-kit-4.5/model/lang_m/bccwj.60k.pdp.htkdic にテキストエディタなどで、1行に1つずつ、単語とその読みを定義し追加します。
1 |
ユーチューブ+名詞 [ユーチューブ] y_B u:_I ch_I u:_I b_I u_E |
再度精度確認
それでは再度実行し、結果を見てみましょう。
音声データ | 認識結果(Julius) |
趣味はYouTubeの動画を観ることです | 趣味 は ユーチューブ の 動画 を 見る こと です 。 |
追加前は、「冬 中 黒 丘」となっていた箇所が、今度はうまく認識できるようになりました。認識できるようにすぐカスタマイズできるのはJuliusの良さですね。
ツール2:ESPnet2
ESPnet2とは
ESPnetは、オープンソースのEnd-to-End型※音声処理ツールキットです。今回使うESPnet2は、開発中のようですが、そのESPnetに利便性や拡張性を高めるための改良が加えられたツールキットです。
※End-to-End型とは…音声認識のモジュールが1つのニューラルネットワークで構成されているモデル
導入
GitHubにデモが公開されているので、Google Colaboratory上で簡単に試すことができます。今回は音声認識(ASR)のデモをベースに進めます。
精度確認
Julius同様、こちらも認識できる音声ファイルに制限があるので注意してください。Juliusで動作した音声ファイルであれば問題ありません。ESPnet2では、学習済みモデルが公開されています。
下表は、公開されている学習済みモデルのうち、日本語に対応してそうなもののみ一部抜粋しています。
コーパス名(言語テキスト) | モデル名 | |
モデル1 | csj | kan-bayashi/csj_asr_train_asr_transformer_raw_char_sp_valid.acc.ave |
モデル2 | jsut | Hoon Chung/jsut_asr_train_asr_conformer8_raw_char_sp_valid.acc.ave |
モデル3 | laborotv | Shinji Watanabe/laborotv_asr_train_asr_conformer2_latest33_raw_char_sp_valid.acc.ave |
それでは、それぞれのモデルを使って認識結果を見ていきます。
認識結果(ESPnet2) | |||
音声データ | モデル1(csj) | モデル2(jsut) | モデル3(laborotv) |
こんにちは | ん今日は | さいは。 | こんにちは。 |
これから打ち合わせを始めます | んこれから打ち合わせを始めます | すそれがるうちしを始めまし。 | これから打ち合わせを始めます |
趣味はYouTubeの動画を観ることです | えっとー趣味は有中区の増加を見ることです | 進みは、遊十部の、とがをる。 | なんですか |
学習済みのモデルで、うまく認識できている箇所もありますが、ノイズやわずかな「アー」や「エー」等のフィラー(言い淀み)を誤認識していたり、日本語になっていないものもありますね。
ツール3:SpeechRecognition
SpeechRecognitionとは
SpeechRecognitionは、オンライン・オフラインでいくつかのエンジンとAPIをサポートしている、音声認識用のPythonライブラリです。
【注意事項】
- 無償で利用できるものと有償のものがありますので、詳細はドキュメントを確認してください。
- 今回使うGoogle Speech Recognition APIは無償で利用できますが、個人的な目的またはテスト目的でのみ使用するようにしてください。
導入に関しては、pipで簡単にインストールすることができます。
1 2 3 |
%%bash pip install speechrecognition |
精度確認
下記コードで音声認識をしてみます。
1 2 3 4 5 6 7 8 9 10 11 |
import speech_recognition as sr input_audio_file = "{音声ファイル名}" recognizer = sr.Recognizer() with sr.AudioFile(input_audio_file) as source: audio = recognizer.record(source) recognition_result = recognizer.recognize_google(audio, language='ja-JP') print(recognition_result) |
音声データ | 認識結果(SpeechRecognition) |
こんにちは | こんにちは |
これから打ち合わせを始めます | これから打ち合わせを始めます |
趣味はYouTubeの動画を観ることです | 趣味は YouTube の動画を見ることです |
かなり精度高く認識できていますね!
おわりに
簡単に試せるツールでもここまで認識できるのかと驚きがありました。結果としては、SpeechRecognitionが一番精度がよかったですが、カスタマイズや使用用途によっては、他のツールも十分使えそうです。また、今回は1文程度の音声で、ほとんど調整等もせずやりましたが、音声録音時の環境や状況、話し方によっては、うまくいかない場合も多々あります。
音声認識はいろいろな場面で活用できると思いますので、ぜひみなさんも試してみてください。
執筆者プロフィール

- tdi デジタルイノベーション技術部
- 配属後、ロボコン担当として、ETロボコン2017東京地区大会優勝・ITAロボコン2017優勝に貢献。現在は、AIチームの一員として、機械学習、ディープラーニングなどに挑戦しています。