🎙️
SpeechRecognitionを使ったマイク音声認識
以下の記事を参考にマイク入力に対する音声認識とファイル出力を行うクラスを作ったのでまとめます.
動作環境
- 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
素人質問です。
kaeru39さんを参考にしてチャットボットをつくっています。
別ファイルにあるクラスを別のファイルで実行するにはどうすればよいですか?
ご質問ありがとうございます。
おそらく以下の状況という想定で回答します。
この場合はB.pyのファイルで下記のように書くと別ファイルにあるクラスを実行できます。
参考にしていただいてとても励みになります。
一緒に開発がんばりましょう!
ありがとうございます!!
頑張ります!!