【音声認識】Python x CMU Sphinx で音声認識入門

皆さんこんにちは!WESEEK ソフトウェアエンジニアの 増山 です。

今回のブログでは、Python と 音声認識ライブラリ CMU Sphinx を使って簡単な音声認識をやってみます。

目次

ソースコード

動くコードは https://github.com/hakumizuki/python_sphinx_sample にあります。

こちらのレポジトリをベースに説明していくので、実際に手元で動かして見たい方は git clone https://github.com/hakumizuki/python_sphinx_sample をお願いします。

また説明では devcontainer を使用しますが、マイクなどの外部機器を使うときにはコンテナより実機の方が使いやすいと思いますので、その場合は Dockerfile の依存しているパッケージのインストール部分などを参考して直接 OS 上で実行してみてください。

SpeechRecognition ライブラリ

CMU Sphinx を Python で扱うには、さまざまな音声認識 API を司る SpeechRecognition ライブラリを使用します。

CMU Sphinx は OSS として開発されている音声認識ツールです。Google Cloud Speech API などと違って完全にオフラインで動くのでインターネットを必要しないことが強みの一つだと思います。言語モデルを用意することでどんな言語でも音声認識できます。詳しくは こちら

他の手段を試してみたい方は こちら を参考にしてください。

環境構築

  1. Docker をインストール
  2. VSCode をインストール
  3. $ git clone https://github.com/hakumizuki/python_sphinx_sample
  4. $ cd ./python_sphinx_sample
  5. $ code .
  6. Ctrl+P or Command+P を押し、Reopen in container と入力して出てきた候補をクリック

これで devcontainer が起動して環境構築が完了しました。ではプログラムを見ていきましょう。

プログラム説明

主に使用するライブラリは SpeechRecognition という Python の音声認識用ライブラリです。

ファイルパスなどの定数は constants.py に、音声認識のプログラムは recognize.py に書きました。

constants.py

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

MP3_TEMP_OUT=f'{BASE_DIR}/audios/speech.temp.mp3'
WAV_OUT=f'{BASE_DIR}/audios/speech.wav'

recognize.py

import speech_recognition as sr
import sys

from constants import BASE_DIR, WAV_OUT

def main():
    mode = None

    # *1
    # Get mode from args
    if len(sys.argv) > 2:
        raise Exception(f'Too many args. (pass "mic" or don\'t pass to use "{WAV_OUT}" file)')
    elif len(sys.argv) == 2:
        mode = sys.argv[1]

    recognize_result = recognize(mode)

    print(recognize_result)

def recognize(mode):
    text = None
    # *1
    audio_src = sr.Microphone() if mode == 'mic' else sr.AudioFile(WAV_OUT)

    with audio_src as audio_file:
        # *2
        # Initialize a Recognizer
        r = sr.Recognizer()
        # Remove noise
        # r.adjust_for_ambient_noise(audio_file, duration=10)
        # Convert audio source to a recognizable object
        recognizable = r.record(audio_file, duration=10)
        text = r.recognize_sphinx(recognizable)

    return text

*1

python recognize.py <mode> という使い方を想定しています。mode には mic を渡すとマイクから入った音声をを音声ソースとして使用し、何も渡さないと constants.py の WAV_OUT にある音声ファイルを音声ソースとして使用します。

マイクを使用するには以下を参考にしてください。

  • コンテナの外でスクリプトを実行する
  • この記事 などを参考にコンテナ上でマイクを使えるように設定する

*2

  1. Recognizer インスタンスを生成
  2. record メソッドで音声ファイルから音声認識用オブジェクトを生成
  3. recognize_sphinx メソッドに音声認識用オブジェクトを渡して実行することで音声認識が実行される

動かしてみる

今回はレポジトリに内包している speech.py で音声ファイルを作成して、それを認識させてみたいと思います。speech.py は英語の文字列を受け取ってそれを音声ファイルに変換します。

  1. $ mkdir ./audios
    • src と同じ階層
  2. $ python speech.py "apple banana"
    • 好きな英語に変更できます
  3. $ python recognize.py
$ python recognize.py
apple banana

と表示されれば成功です。

終わりに

ここまでお読みいただきありがとうございました。

質問等ありましたら 増山の Twitter に DM 送っていただければ答えられる範囲でお答えします。