さて、GUIの作成と実際の画面動作を作成するPySimpleGuiを使ったpyファイルの説明をしてきました。
今回は残りのpyコードを紹介していきます。
前回記事をご確認いただけていない方は、以下の記事をご確認ください。
おさらい:ファイル構成概要
まずはファイル構成を再度掲載していきますね。
-speech_to_text.dir |-functions.dir |- __init__.py |- audio_input.py |- cloud_speech_sample.py |- templatelike.py |- pysimplegui.py |- result.wav
前回説明したのはpysimplegui.pyでした。今回は残りのpyファイル、functions.dirに含まれているpyのコード群を説明していきます。
audio_input.py: マイクから音声録音してwavファイルを作成する
さて、一つ目はaudio_input関係のファイルになります。
このファイルでは、見出しにも書きましたが、マイクから音声録音してWavファイルを作成しています。
実際コード掲載
まずは何より実際のコードを掲載していきます。
import pyaudio
import wave
def audio_input():
RECORDING_SECONDS = 10
WAVE_OUTPUT_FileName = "result.wav"
deviceIndex = 0
FORMAT = pyaudio.paInt16
CHANNEL = 1
SAMPLE_RATE = 44100
CHUNK = 2 ** 11 #2の冪乗で指定する
audio = pyaudio.PyAudio()
stream = audio.open(format=FORMAT,
channels=CHANNEL,
rate=SAMPLE_RATE,
input=True,
input_device_index=deviceIndex,
frames_per_buffer=CHUNK)
print("------recording start------")
frames = []
for i in range(0, int(SAMPLE_RATE/CHUNK * RECORDING_SECONDS)):
datas = stream.read(CHUNK)
frames.append(datas)
print("------finish recording------")
stream.stop_stream()
stream.close()
audio.terminate()
waveFile = wave.open(WAVE_OUTPUT_FileName, 'wb')
waveFile.setnchannels(CHANNEL)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(SAMPLE_RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()
def get_device_index():
audio = pyaudio.PyAudio()
for x in range(0, audio.get_device_count()):
print(audio.get_device_info_by_index(x))
実際に使っているのは、audio_inputメソッドだけです。get_device_indexメソッドはaudio_inputで利用するdevice_index, CHANNEL, SAMPLE_RATEなどを変数に入れる値を探すために作っている関数です(今回は利用するチャネルを固定しています)
Macで音声認識するための録音デバイスの探し方
さて、まずはget_device_index()の説明から始めます。音声ファイルを作成するためには、pyaudioを使うケースが多いですが、その場合にどのデバイス(MACに内蔵されているマイクか外部付のマイクかetc)を通して音声ファイルを作成するかを決めなければなりません。
また、音声ファイルを作成するためのデバイスを決めた後は、そのデバイスの情報(レートやdevice_indexなど)を取得してpyaudioに指定する必要があります。
そこで利用するのが、pyaudioのget_device_countメソッドとget_device_info_by_indexメソッドです。この部分の関数で利用しているやつですね。
def get_device_index():
audio = pyaudio.PyAudio()
for x in range(0, audio.get_device_count()):
print(audio.get_device_info_by_index(x))
では、上記関数の実行結果を私のMACベースで紹介していきます。
{'index': 0, 'structVersion': 2, 'name': 'Built-in Microphone', 'hostApi': 0, 'maxInputChannels': 2, 'maxOutputChannels': 0, 'defaultLowInputLatency': 0.0029478458049886623, 'defaultLowOutputLatency': 0.01, 'defaultHighInputLatency': 0.01310657596371882, 'defaultHighOutputLatency': 0.1, 'defaultSampleRate': 44100.0} {'index': 1, 'structVersion': 2, 'name': 'Built-in Output', 'hostApi': 0, 'maxInputChannels': 0, 'maxOutputChannels': 2, 'defaultLowInputLatency': 0.01, 'defaultLowOutputLatency': 0.010408163265306122, 'defaultHighInputLatency': 0.1, 'defaultHighOutputLatency': 0.02056689342403628, 'defaultSampleRate': 44100.0}
今回利用するのはBuild-in Microphone(入力用オーディオ)のため、index:0の最初に表示されているデータを利用していきます。必要部分はハイライトしてありますので、上の表示結果と実際のコード(この後説明するwavファイル作成コード)を比較して見てください。
録音してwavファイルを作成する
さて、speech to text APIを使って文字起こしするためには、APIに渡す音声ファイルを作成する必要があります。
先ほどまでは、デバイスの指定方法を解説してきましたが、この段落では実際に音声ファイル(今回は非圧縮のwavファイル)を作成していきます。音声ファイルの種類や圧縮・非圧縮などの音声ファイル自体については、今回は説明していきませんので、興味ある方はググって見てください。
実際コード再掲載
さて、まずは該当部分のコードを再掲載します。
def audio_input():
RECORDING_SECONDS = 10
WAVE_OUTPUT_FileName = "result.wav"
deviceIndex = 0
FORMAT = pyaudio.paInt16
CHANNEL = 1
SAMPLE_RATE = 44100
CHUNK = 2 ** 11 #2の冪乗で指定する
audio = pyaudio.PyAudio()
stream = audio.open(format=FORMAT,
channels=CHANNEL,
rate=SAMPLE_RATE,
input=True,
input_device_index=deviceIndex,
frames_per_buffer=CHUNK)
print("------recording start------")
frames = []
for i in range(0, int(SAMPLE_RATE/CHUNK * RECORDING_SECONDS)):
datas = stream.read(CHUNK)
frames.append(datas)
print("------finish recording------")
stream.stop_stream()
stream.close()
audio.terminate()
waveFile = wave.open(WAVE_OUTPUT_FileName, 'wb')
waveFile.setnchannels(CHANNEL)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(SAMPLE_RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()
ざっくりイメージの流れ
このコードが担っていることの全体像を軽く説明します。
pyaudioでpyduioインスタンスを作成して、そこで指定した入力情報に元ずくstreamを作成して、MACの Build-in microphoneを通して実際に録音されている音声をチャンク区切りにしてframe単位で音声ファイルに実際に登録していく。
少し音声ファイルを取り扱ったことがない方にはframeだとかstreamだとかわかりにくい概念が含まれているかと思いますが、今回はそこまで解説できないので調べるか、そんなもんなのかと思って先に進んでいただければと思います。
まとめ
今回はコードの全体像の中で、pyaudioを利用した音声ファイルの作成方法を見ていきました。ちょっと私も専門領域ではないので、わからないことも多々ありますが、ここは専門にすることが今後ないだろうし軽く知っていればいいかなぁという感覚でpyaudioやwave(pythonの標準ライブラリ)などを利用しています。
次回以降で実際今回作成したファイルをSpeech to text APIに受け渡して、文字起こしをする部分を説明していきます。
関連記事: python speech to text APIを利用して音声認識ファイルを文字起こししてみよう
pythonでGoogleが提供するspeech to text APIを利用して音声認識ファイルを文字起こししてみます。speech to text APIの基本的な使い方、Macでのマイクを利用したwavファイルの作成方法、pythonでのメジャーGUIツールを利用した感想などを紹介していきます。