麦克风录音
这篇文章会介绍使用 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')
微信扫码关注
抖音扫码关注