🎙️

SpeechRecognitionを使ったマイク音声認識

2023/01/13に公開3

以下の記事を参考にマイク入力に対する音声認識とファイル出力を行うクラスを作ったのでまとめます.
https://qiita.com/daiarg/items/ff1b9f91d0804e6a8f18

動作環境

  • Ubuntu20.04
  • Python3.8.10

環境構築

sudo apt-get install portaudio19-dev
sudo apt-get install python-pyaudio python3-pyaudio
pip3 install SpeechRecognition==3.8.1
pip install pyaudio==0.2.12

実装

SpeechRecognizerクラスを実装します.

全体実装 62行
import os
import speech_recognition as sr
from datetime import datetime


class SpeechRecognizer:
    """マイクで受け取った音声を認識してファイル出力するクラス
    """
    def __init__(self):
        os.makedirs("./out", exist_ok=True)
        self.path = f"./out/asr.txt"

        self.rec = sr.Recognizer()
        self.mic = sr.Microphone()
        self.speech = []
        return

    def grab_audio(self) -> sr.AudioData:
        """マイクで音声を受け取る関数

        Returns:
            speech_recognition.AudioData: 音声認識エンジンで受け取った音声データ
        """
        print("何か話してください...")
        with self.mic as source:
            self.rec.adjust_for_ambient_noise(source)
            audio = self.rec.listen(source)
        return audio

    def recognize_audio(self, audio: sr.AudioData) -> str:
        print ("認識中...")
        try:
            speech = self.rec.recognize_google(audio, language='ja-JP')
        except sr.UnknownValueError:
            speech = f"#認識できませんでした"
            print(speech)
        except sr.RequestError as e:
            speech = f"#音声認識のリクエストが失敗しました:{e}"
            print(speech)
        return speech

    def run(self):
        """マイクで受け取った音声を認識してテキストファイルに出力
        """
        while True:
            audio = self.grab_audio()
            speech = self.recognize_audio(audio)

            if speech == "終わり":
                print("音声認識終了")
                break
            else:
                self.speech.append(speech)
                print(speech)

        with open(self.path, mode='w', encoding="utf-8") as out:
            out.write(datetime.now().strftime('%Y%m%d_%H:%M:%S') + "\n\n")
            out.write("\n".join(self.speech) + "\n")

if __name__ == "__main__":
    sp = SpeechRecognizer()
    sp.run()
  • import
    出力フォルダ作成用と音声認識エンジン用のライブラリを読み込みます.
import os
import speech_recognition as sr
from datetime import datetime
  • __ init __
    入出力用のフォルダの作成や音声認識に使うエンジンを宣言しておきます.
class SpeechRecognizer:
        def __init__(self):
        """出力フォルダの作成と保存先の設定,マイク入力と認識エンジンの初期化
        """
        os.makedirs("./out", exist_ok=True)
        self.path = f"./out/asr.txt"

        self.rec = sr.Recognizer()
        self.mic = sr.Microphone()
        self.speech = []
        return
  • grab_audio
    音声認識エンジンがマイク入力をオーディオデータとして受け取ります.
    def grab_audio(self) -> sr.AudioData:
        """マイクで音声を受け取る関数

        Returns:
            speech_recognition.AudioData: 音声認識エンジンで受け取った音声データ
        """
        print("何か話してください...")
        with self.mic as source:
            self.rec.adjust_for_ambient_noise(source)
            audio = self.rec.listen(source)
        return audio
  • recognize_audio
    音声認識エンジンがオーディオデータを日本語テキストに変換します.
    def recognize_audio(self, audio: sr.AudioData) -> str:
        print ("認識中...")
        try:
            speech = self.rec.recognize_google(audio, language='ja-JP')
        except sr.UnknownValueError:
            speech = f"#認識できませんでした"
            print(speech)
        except sr.RequestError as e:
            speech = f"#音声認識のリクエストが失敗しました:{e}"
            print(speech)
        return speech
  • run
    上記の動作を繰り返し終了時に日付を追記してファイル出力します.
    def run(self):
        """マイクで受け取った音声を認識してテキストに出力
        """
        while True:
            audio = self.grab_audio()
            speech = self.recognize_audio(audio)

            if speech == "終わり":
                print("音声認識終了")
                break
            else:
                self.speech.append(speech)
                print(speech)

        with open(self.path, mode='w', encoding="utf-8") as out:
            out.write(datetime.now().strftime('%Y%m%d_%H:%M:%S') + "\n\n")
            out.write("\n".join(self.speech) + "\n")

動作確認

  • ターミナル
何か話してください...
認識中...
こんにちは これはテストです
何か話してください...
認識中...
今日の天気は晴れです 曇りなってるかもしれない
何か話してください...
認識中...
音声認識終了
  • 出力ファイル ./out/asr.txt
20230103_14:49:43
こんにちは これはテストです
今日の天気は晴れです 曇りなってるかもしれない

まとめ

マイク音声入力を認識してファイルに書き起こすクラスを作りました.オーディオファイルの受け取りとapiによる音声認識のみのため仕組みはとてもシンプルです.リアルタイムには向いていないのでリアルタイムにも対応した実装にも取り組みたいと思います.

Discussion

MarySueMarySue

素人質問です。
kaeru39さんを参考にしてチャットボットをつくっています。
別ファイルにあるクラスを別のファイルで実行するにはどうすればよいですか?

kaeru39kaeru39

ご質問ありがとうございます。
おそらく以下の状況という想定で回答します。

フォルダ
   |---A.py (SpeechRecognitionクラスが実装されている)
   |---B.py (こちらでSpeechRecognitionクラスを実行したい)

この場合はB.pyのファイルで下記のように書くと別ファイルにあるクラスを実行できます。

from A import SpeechRecognition

参考にしていただいてとても励みになります。
一緒に開発がんばりましょう!