添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

因為程式中會使用到電腦的麥克風,所以請 使用本機環境 ( 參考: 使用 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')

更多 Python 教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我已經寫了超過 400 篇 Python 的教學,有興趣可以參考下方連結呦~ ^_^

Python 教學 ( 學習導讀 ) Python 網路爬蟲教學 LINE BOT 教學 OpenCV 教學 AI 影像辨識教學