buto > /dev/null

だいたい急に挑戦してゴールにたどり着かずに飽きる日々です

Python USBマイクから入力した音声をファイルにする

過去の自分がpipenvを使っていたことをようやく思い出したので、やっとpythonコードが書けるようになりました!!

歌った時に音程のチェックができるプログラムを書きたい

カラオケの採点モードみたいなプログラムを作るのが最終目標です!

(raspberrypiに実装して上手く歌えていたらランプ点灯みたいにしたいなあ)

pyaudio、waveインストール

まずは録音するためのpyaudio、音声ファイルを作成するためのwave

brew install pyaudio
pipenv install pyaudio

pipenvインストールで早速引っかかる。

Creating a virtualenv for this project...
~ 中略 ~
Installing pyaudio...
Error:  An error occurred while installing pyaudio!

よし、pipenvはあきらめてpip使おう。

buto@LisanoMacBook-Air ~ % pip install pyaudio
Collecting pyaudio
  Downloading PyAudio-0.2.11.tar.gz (37 kB)
Could not build wheels for pyaudio, since package 'wheel' is not installed.
Installing collected packages: pyaudio
    Running setup.py install for pyaudio ... done
Successfully installed pyaudio-0.2.11
WARNING: You are using pip version 20.1; however, version 21.3.1 is available.
You should consider upgrading via the '/Users/buto/.pyenv/versions/3.8.2/bin/python3.8 -m pip install --upgrade pip' command.

warning出てるけどまあいっか笑 waveも同様にpipでインストールしました

マイクの設定

私は600円ほどのUSBマイクを買いました(Amazonでは売り切れている人気商品!)

共立プロダクツ MI-305 [USBマイク]

今日はraspberrypiではなくMacBookで試してみるのでマイクをPC内蔵からUSBに切り替えます

f:id:butorisa:20211207232835p:plain

マイクで録音してwavファイルを作成する

Python3で録音してwavファイルに書き出すプログラム

もうコピペでいいですね笑 丁寧なコメントまで書かれているので勉強にもなります

私は録音の秒数を3秒に、サンプルレートを4420Hz、ファイル名をvoice.wavに変更しました

import pyaudio
import wave
 
RECORD_SECONDS = 3 #録音する時間の長さ(秒)
WAVE_OUTPUT_FILENAME = "voice.wav" #音声を保存するファイル名
iDeviceIndex = 0 #録音デバイスのインデックス番号
 
#基本情報の設定
FORMAT = pyaudio.paInt16 #音声のフォーマット
CHANNELS = 1             #モノラル
RATE = 4420              #サンプルレート
CHUNK = 2**11            #データ点数
audio = pyaudio.PyAudio() #pyaudio.PyAudio()
 
stream = audio.open(format=FORMAT, channels=CHANNELS,
        rate=RATE, input=True,
        input_device_index = iDeviceIndex, #録音デバイスのインデックス番号
        frames_per_buffer=CHUNK)
 
#--------------録音開始---------------
 
print ("recording...")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
 
 
print ("finished recording")
 
#--------------録音終了---------------
 
stream.stop_stream()
stream.close()
audio.terminate()
 
waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()

このコードを実行すると初回は以下のダイアログが出るのでマイクへのアクセスを許可します

f:id:butorisa:20211208001215p:plain

recording...と標準出力に表示されてから3秒録音され、pyファイルと同じディレクトリにvoice.wavが作成されました!

f:id:butorisa:20211208001521p:plain

ちなみにCHANNELS=2にするとステレオモードになるそうです 私はマイク1個なのでモノラルでいいですね

今さら聞けないステレオとモノラルの違い

余談ですがpyaudioで録音するサンプルコードでは44.1kHzが多かったので調べてみるとCDで使われている周波数だそうです

サンプリング周波数選択のポイント

442Hzでチューニングして歌うと10倍以上の4420Hz以上が録音に適したサンプリング周波数となるのかな??