SpeechRecognitionのMicrophoneに入力した音声をESPnetのASRモデルで認識する
workaroundではtempfileを使っている
結論:tempfileとscipyをなくせた🙌
code:simple_version.py
>> wav_bytes = audio.get_wav_data()
>> wav_stream = io.BytesIO(wav_bytes)
>> wav_array, sampling_rate = sf.read(wav_stream)
get_wav_dataはbytesを返すが、np.frombufferではnumpy arrayに変換できなかった
code:frombuffer_error.py
>> wav_bytes = audio.get_wav_data()
>> wav_array = np.frombuffer(wav_bytes, dtype=np.float64)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: buffer size must be a multiple of element size
wav形式のbytesだから?
インメモリストリームを使う
wav_stream = io.BytesIO(wav_bytes)
Parameters filename string or open file handle
ファイルパスだけでなく、open file handleとしてインメモリストリームを渡せる!!
code:through_in_memory_stream.py
>> frame_bytes = audio.get_raw_data()
>> speech_array = np.frombuffer(frame_bytes, dtype=np.int16)
>> stream = io.BytesIO()
>> wavfile.write(stream, audio.sample_rate, speech_array)
>> import soundfile as sf
>> audio_array, sampling_rate = sf.read(stream)
sf.readしたので音声認識できる形式(dtype=np.float64)
sf.readせずにnumpyのastypeでの変換はうまくいかない
scipyを使わずに単純にできる(冒頭で示した)
sf.readにはfile-like objectも渡せる(つまりインメモリストリームもOK)