麥克風錄音
這篇文章會介紹使用 Python 的 pyaudio 第三方函式庫,搭配 Python 內建的 wave 函式庫,實現透過麥克風錄製聲音的功能。
因為程式中會使用到電腦的麥克風,所以請使用本機環境 ( 參考:使用 Python 虛擬環境 ) 或使用 Anaconda Jupyter 進行實作 ( 參考:使用 Anaconda )。
安裝 pyaudio 函式庫
輸入下列指令安裝 pyaudio 函式庫 ( 依照各人環境可使用 pip、pip3,Anaconda 可使用 conda install )
!pip install pyaudio
錄製麥克風聲音
參考「PyAudio Documentation」的範例程式碼,執行後就能進行錄音,詳細說明寫在下方的程式碼中。
import pyaudio
import wave
chunk = 1024 # 記錄聲音的樣本區塊大小
sample_format = pyaudio.paInt16 # 樣本格式,可使用 paFloat32、paInt32、paInt24、paInt16、paInt8、paUInt8、paCustomFormat
channels = 2 # 聲道數量
fs = 44100 # 取樣頻率,常見值為 44100 ( CD )、48000 ( DVD )、22050、24000、12000 和 11025。
seconds = 5 # 錄音秒數
filename = "oxxostudio.wav" # 錄音檔名
p = pyaudio.PyAudio() # 建立 pyaudio 物件
print("開始錄音...")
# 開啟錄音串流
stream = p.open(format=sample_format, channels=channels, rate=fs, frames_per_buffer=chunk, input=True)
frames = [] # 建立聲音串列
for i in range(0, int(fs / chunk * seconds)):
data = stream.read(chunk)
frames.append(data) # 將聲音記錄到串列中
stream.stop_stream() # 停止錄音
stream.close() # 關閉串流
p.terminate()
print('錄音結束...')
wf = wave.open(filename, 'wb') # 開啟聲音記錄檔
wf.setnchannels(channels) # 設定聲道
wf.setsampwidth(p.get_sample_size(sample_format)) # 設定格式
wf.setframerate(fs) # 設定取樣頻率
wf.writeframes(b''.join(frames)) # 存檔
wf.close()
搭配 pydub 實現轉 mp3 或混音功能
參考「取得聲音資訊、輸出聲音、聲音的混合與反轉」兩篇文章,在程式中加入 pydub 功能,就能將錄製的 wav 檔案轉換成 mp3,或混合背景音樂。
import pyaudio
import wave
from pydub import AudioSegment # 載入 pydub 的 AudioSegment 模組
from pydub.playback import play # 載入 pydub.playback 的 play 模組
chunk = 1024
sample_format = pyaudio.paInt16
channels = 2
fs = 44100
seconds = 5
filename = "oxxostudio.wav"
p = pyaudio.PyAudio()
print("開始錄音...")
stream = p.open(format=sample_format,
channels=channels,
rate=fs,
frames_per_buffer=chunk,
input=True)
frames = []
for i in range(0, int(fs / chunk * seconds)):
data = stream.read(chunk)
frames.append(data)
stream.stop_stream()
stream.close()
p.terminate()
print('錄音結束...')
wf = wave.open(filename, 'wb')
wf.setnchannels(channels)
wf.setsampwidth(p.get_sample_size(sample_format))
wf.setframerate(fs)
wf.writeframes(b''.join(frames))
wf.close()
song = AudioSegment.from_mp3("song.mp3") # 讀取背景音樂 mp3 檔案
voice = AudioSegment.from_wav("oxxostudio.wav") # 讀取錄音 wav 檔案
output = voice.overlay(song, loop=True) # 混合錄音和背景音樂
play(output) # 播放聲音
output.export('output.mp3') # 輸出為 mp3
print('ok')
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~