iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
Python

一些Python可以做的事系列 第 22

[python] 麥克風錄音

  • 分享至 

  • xImage
  •  

在這篇文章中,我們將介紹如何使用 Python 的 pyaudio 第三方函式庫,搭配內建的 wave 函式庫來錄製音頻。這是一個非常實用的功能,適合用於錄製講座、會議、或創作音樂等應用場景。

安裝 pyaudio 函式庫

$pip install pyaudio

介紹 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 格式

如果想將錄製的 WAV 格式轉換為 MP3 格式,可以使用 ffmpeg 這個工具,它是一個強大的多媒體處理工具,支持音頻和影片格式轉換。以下是如何在 Python 中使用 ffmpeg 來完成這個轉換的步驟。

安裝 ffmpeg

首先,你需要安裝 ffmpeg。你可以從 ffmpeg 官方網站 下載並安裝適合你操作系統的版本。

在 macOS 上,可以使用 Homebrew 安裝:

brew install ffmpeg

使用 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)

結合上面兩段程式碼(錄製音頻並轉換成mp3檔)

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


上一篇
[Python] 螢幕截圖
下一篇
[Python] 電腦攝像頭錄影
系列文
一些Python可以做的事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言