【完全攻略】Pythonで自作の音声認識をオフラインでも実施できるようにする 解説付き

python

こんにちは、社畜です。

以前、下記記事の中で、無料で簡単に音声認識を自作する方法として、

PythonのSpeech recognitionを紹介しました。

※Speech recognitionのインストール方法や基本的な使い方は下記記事の中で紹介しています


オフライン使用に課題あり

GoogleのAPIを使って音声認識できる機能が無料で付属しており、基本的に問題なく使用できると思いますが、オフラインで使えないという最大の問題が。。。

一度音声化(waveファイル)にして、それを音声認識APIに送信→テキストとして受信という流れのため

Googleの場合だと一度オンラインでwaveファイルを送信しないといけないわけです。

公式サイトを確認すると、オフライン1つ、オンライン6つと複数のAPIがありました。

せっかくなので、他のオンラインも含めて Speech recognitionを徹底的にまとめていきたいと思います。

CMU Sphinx (works offline)

・Google Speech Recognition

Google Cloud Speech API

Wit.ai

Microsoft Bing Voice Recognition

Houndify API

IBM Speech to Text

https://pypi.org/project/SpeechRecognition/#description

それじゃあ行きましょう。

まずは、Pythonで自作の音声認識を作るときのAPIまとめ

調査の結果下記となりました。

APIオフライン日本語対応登録が必要か
CMU SphinxOK英語のみ不要
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
表示する英単語 発音記号

ここから、発音記号に対して単語を設定しているようです。

であれば、日本語を発音したときに読み取られる英単語と日本語を紐づける変換テーブルがあれば

実質日本語を識別させることが可能となりますね!

 

手順としては下記です

  1. 認識させたい日本語を複数回話す
  2. 上記の結果をどのような英単語で読みられたかのリストを保存する
  3. 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

 

 

プログラミング学習者へのオススメ記事

エンジニア志望者へのオススメ記事

タイトルとURLをコピーしました