iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0

這篇文章會介紹使用 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')

更多 Python 教學

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


上一篇
( Day 15 ) 調整聲音音量和速度
下一篇
( Day 17 ) 影片轉檔 ( mp4、mov、wmv、avi...等 )
系列文
學 Python 到底可以幹麻勒?41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言