在這篇文章中,我們將介紹如何使用 Python 的 pyaudio 第三方函式庫,搭配內建的 wave 函式庫來錄製音頻。這是一個非常實用的功能,適合用於錄製講座、會議、或創作音樂等應用場景。
$pip install pyaudio
pyaudio 是一個用於處理音頻的函式庫,它可以讓你輕鬆地錄製和播放音頻。下面的示例展示了如何使用 pyaudio 來錄製聲音並保存為 WAV 文件。
import pyaudio
import wave
# 設定錄製參數
FORMAT = pyaudio.paInt16 # 音頻格式
CHANNELS = 1 # 聲道數量
RATE = 44100 # 取樣頻率
CHUNK = 1024 # 記錄聲音的樣本區塊大小
RECORD_SECONDS = 5 # 錄音時長(秒)
WAVE_OUTPUT_FILENAME = "output.wav" # 儲存檔案名稱
# 初始化 pyaudio
audio = pyaudio.PyAudio()
print("開始錄音...")
# 開啟錄音串流
stream = audio.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
frames = [] # 建立聲音串列
# 錄製音頻
for _ in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
# 將聲音記錄到串列中
frames.append(data)
print("錄音結束。")
# 停止錄音流
stream.stop_stream() # 停止錄音
stream.close() # 關閉串流
audio.terminate()
# 儲存音頻為 WAV 檔案
with wave.open(WAVE_OUTPUT_FILENAME, 'wb') as wf:
wf.setnchannels(CHANNELS) # 設定聲道
wf.setsampwidth(audio.get_sample_size(FORMAT)) # 設定格式
wf.setframerate(RATE) # 設定取樣頻率
wf.writeframes(b''.join(frames)) # 存檔
print(f"已儲存為 {WAVE_OUTPUT_FILENAME}")
如果想將錄製的 WAV 格式轉換為 MP3 格式,可以使用 ffmpeg 這個工具,它是一個強大的多媒體處理工具,支持音頻和影片格式轉換。以下是如何在 Python 中使用 ffmpeg 來完成這個轉換的步驟。
首先,你需要安裝 ffmpeg。你可以從 ffmpeg 官方網站 下載並安裝適合你操作系統的版本。
在 macOS 上,可以使用 Homebrew 安裝:
brew install ffmpeg
安裝了 ffmpeg 之後,可以在 Python 中使用 subprocess 模塊來引用 ffmpeg 命令進行轉換。
import subprocess
def convert_wav_to_mp3(input_filename, output_filename):
try:
# 調用 ffmpeg 進行轉換
subprocess.run([
'ffmpeg', '-i', input_filename, # 輸入文件
output_filename # 輸出文件
], check=True)
print(f"轉換完成: {output_filename}")
# 使用示例
input_file = 'output.wav'
output_file = 'output.mp3'
convert_wav_to_mp3(input_file, output_file)
import pyaudio
import wave
import subprocess
# 設定錄製參數
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 1024
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"
MP3_OUTPUT_FILENAME = "output.mp3"
# 初始化 pyaudio
audio = pyaudio.PyAudio()
print("開始錄音...")
# 開啟錄音串流
stream = audio.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
frames = []
# 錄製音頻
for _ in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("錄音結束。")
# 停止錄音流
stream.stop_stream()
stream.close()
audio.terminate()
# 儲存音頻為 WAV 檔案
with wave.open(WAVE_OUTPUT_FILENAME, 'wb') as wf:
wf.setnchannels(CHANNELS)
wf.setsampwidth(audio.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
print(f"已儲存為 {WAVE_OUTPUT_FILENAME}")
# 使用 ffmpeg 轉換 WAV 為 MP3
try:
subprocess.run([
'ffmpeg', '-i', WAVE_OUTPUT_FILENAME, # 輸入文件
MP3_OUTPUT_FILENAME # 輸出文件
], check=True)
print(f"轉換完成: {MP3_OUTPUT_FILENAME}")
except subprocess.CalledProcessError as e:
print(f"轉換過程中發生錯誤: {e}")
參考資料 :
https://steam.oxxostudio.tw/category/python/example/record-audio.html