こんにちは、社畜です。
以前、下記記事の中で、無料で簡単に音声認識を自作する方法として、
PythonのSpeech recognitionを紹介しました。
※Speech recognitionのインストール方法や基本的な使い方は下記記事の中で紹介しています
オフライン使用に課題あり
GoogleのAPIを使って音声認識できる機能が無料で付属しており、基本的に問題なく使用できると思いますが、オフラインで使えないという最大の問題が。。。
一度音声化(waveファイル)にして、それを音声認識APIに送信→テキストとして受信という流れのため
Googleの場合だと一度オンラインでwaveファイルを送信しないといけないわけです。

公式サイトを確認すると、オフライン1つ、オンライン6つと複数のAPIがありました。
せっかくなので、他のオンラインも含めて Speech recognitionを徹底的にまとめていきたいと思います。
・CMU Sphinx (works offline)
・Google Speech Recognition
・Microsoft Bing Voice Recognition
https://pypi.org/project/SpeechRecognition/#description
それじゃあ行きましょう。
まずは、Pythonで自作の音声認識を作るときのAPIまとめ

調査の結果下記となりました。
API | オフライン | 日本語対応 | 登録が必要か |
CMU Sphinx | OK | 英語のみ | 不要 |
Google Speech Recognition | 未対応 | 日本語対応 | 不要 |
Google Cloud Speech API | 未対応 | 日本語対応 | アカウント登録が必要 |
Wit.ai | 未対応 | 日本語対応 | アカウント登録が必要 |
Microsoft Bing Voice Recognition | 未対応 | 日本語対応 | アカウント登録が必要 |
Houndify API | 未対応 | 日本語対応 | アカウント登録が必要 |
IBM Speech to Text | 未対応 | 日本語対応 | アカウント登録が必要 |
えっ?詰んでない?。。。実質下記を使うしかないですね。(徹底的にまとめるつもりだったのに)
- オンラインなら、Google Speech Recognition
- オフラインなら、CMU Sphinx
せめてCMU Sphinxで単語だけでも日本語を認識できないか
苦し紛れではありますが、第二の策にでることにします。
CMU Sphinxでどうにか単語だけでも日本語を認識させる
オフラインで音声認識させる。
その心は、おそらく単語で良いから認識させてその時に何かしらの行動をおこしたい。という目的だと思います。
(議事録のような長文を変換するときには、オンラインの環境があると思いますので)
なので、3つか4つ程度の単語を識別できれば十分と考えますので、CMU Sphinxをチューニングしてきます。
CMU Sphinxの変換テーブルを作り、日本語を無理やり識別する
Python36\Lib\site-packages\speech_recognition\pocketsphinx-data\en-USの中にある
pronounciation-dictionary.dictを開くと下記のように、定義されていることが確認できました
abc EY B IY S IY
表示する英単語 発音記号
ここから、発音記号に対して単語を設定しているようです。
であれば、日本語を発音したときに読み取られる英単語と日本語を紐づける変換テーブルがあれば
実質日本語を識別させることが可能となりますね!
手順としては下記です
- 認識させたい日本語を複数回話す
- 上記の結果をどのような英単語で読みられたかのリストを保存する
- Python上で上記の英単語を認識したときには、特定の日本語を認識した結果として扱う
これで実施してみました
早速トレーニング環境を自動化します。ひたすら同じ単語をしゃべるまくります。
# -*- coding: utf-8 -*-
import speech_recognition as sr
def Learning():
r = sr.Recognizer()
cnt = 0
list = []
with sr.Microphone() as source:
while(cnt<4): #ここの数を増やせば、よりタフネスが上がります
r.adjust_for_ambient_noise(source)
print("=== 何か、話しかけてください ===")
audio = r.listen(source)
print("[o] ===> オーディオGET")
print("=== CMU Sphinx音声解析中 ===")
text = r.recognize_sphinx(audio)
print("You said : " + text)
list.append(text)
cnt = cnt + 1
print(list)
if __name__ == "__main__":
Learning()
試しに、「とまれ」という日本語で実施してみました。

これで変換テーブルが作成できました!
実際にCMU Sphinxで日本語を認識してみる
日本語で、下記のようなコードにしてtextの中に抽出された単語がいたら、
強制的に「とまれ」と出力するコードにしてみました。(分かりやすいように)
わかりやすいように、Google Speech Recognitionも日本語モードで受付をし
結果を比較してみることに。
# -*- coding: utf-8 -*-
import speech_recognition as sr
import subprocess
def Getspeaking_value():
r = sr.Recognizer()
with sr.Microphone() as source:
r.adjust_for_ambient_noise(source)
print("=== 何か、話しかけてください ===")
audio = r.listen(source)
print("[o] ===> オーディオGET")
try:
print("=== CMU Sphinx音声解析中 ===")
text = r.recognize_sphinx(audio)
if (text in ['come on it', 'oh my', 'come on that', 'oh my']): #ここで英語->日本語変換判断
print("You said : " + "とまれ")
except:
print("error")
pass
try:
print("=== Google Speech Recognition音声解析中 ===")
text = r.recognize_google(audio,language="ja-JP")
print("You said : " + text)
except:
print("error")
pass
if __name__ == "__main__":
Getspeaking_value()

無事、CMU Sphinxの結果とGoogle Speech Recognitionの結果が一致しました!
ということで、まとめですが
- Speech Recognitionは、オンラインはGoogle Speech recognition オフラインはCMU Sphinxしか簡単には使えない
- CMU Sphinxは英語のみしか対応していないが、変換テーブルを作成することで単語であれば日本語を無理やり識別することが可能
何ごとも諦めないことが肝心!
楽しい検証と良い結果でしたね。
質問はTwitterから受け付けていますので、お気軽にどうぞ
>>pythonで生き延びる社畜(@coin_python) | Twitter
ラジオ放送でもエンジニアについて熱く語っています。こちらもお楽しみください
>>社畜戦士のエンジニアを熱く語るラジオ | stand.fm
プログラミング学習者へのオススメ記事
エンジニア志望者へのオススメ記事
コメント
[…] […]