簡體   English   中英

PyAudio 實時錄音和回放

[英]PyAudio Recording and Playing Back in Real Time

我正在嘗試從麥克風錄制音頻,然后通過揚聲器播放該音頻。 最終我想在播放之前修改音頻,但我無法獲取輸入數據並通過揚聲器成功播放。

我使用的輸入 stream 的格式是 Int16,output stream 的格式是 Float32。 這些是唯一能發出任何聲音的(盡管是惡魔般的聲音)。

首先,我嘗試簡單地將輸入數據放入 output stream。這會輸出一個惡魔般的聲音:

import pyaudio
import numpy as np
import struct

FORMATIN = pyaudio.paInt16
FORMATOUT = pyaudio.paFloat32
CHANNELS = 1
RATE = 44100
CHUNK = 1024


audio = pyaudio.PyAudio()

# start Recording
streamIn = audio.open(format=FORMATIN, channels=CHANNELS,
                      rate=RATE, input=True, input_device_index=0,
                      frames_per_buffer=CHUNK)
streamOut = audio.open(format=FORMATOUT, channels=CHANNELS,
                       rate=RATE, output=True, input_device_index=0,
                       frames_per_buffer=CHUNK)
print("recording...")


while True:
    in_data = streamIn.read(CHUNK)
    streamOut.write(in_data)

打印出來的in_data如下:

1\x00\x12\x00\x0f\x00\x05\x00\x14\x00\x1e\x00\x16\x00\x14\x00\x12\x00\x10\x00\x02\x00\xf7\xff\xf7\xff\xd4\xff\xde\xff\xf8\xff\xd3\xff\xe9\xff\x14\x00@\x00Z\x00\xb9\xfft\xff\xce\x00\x93\x01\xc2\xff\xe4\xfe\x93\x00d\x00\xca\xff\x94\x01V\x01\xc8\xffS\x00t\x00\xc4\xffi\x00\xaf\x01l\x00\xdb\xfeM\xffw\xffp\x01\xf5\xffr\xfc\x97\x00~\x02S\x00\x97\x00v\x00\x87\xfe\xb7\xfc\x81\xff\xf6\x00\xef\x00\xc4\x03\x84\x02\x99\xfd`\xfc\xe2\x01b\x03\xda\xfe\xc4\xff\xfd\x00:\x00\xc6\x00\xf1\xfcV\xfd\xf0\x02\xdc\xff&\xff\xa1\x02\xc7\xff\xf5\xfe\xa9\xfe\x99\xfa\x06\xfdo\x04\xaa\x02\x8f\xfe\xec\x00\x1b\xffZ\xfe;\x01t\xfe<\xffd\x02<\x02\x04\x02\xcd\xfd\xe8\xfd\xf3\x00i\xfcD\xfa\x86\xfe\xb3\x01\xea\x00$\x00q\x00\x03\x022\x00d\xf9\x14\xfa\x86\xfdQ\xfd\xc5\xfe\x81\x02\xc2\x02=\x01\xfc\x00\xe5\xfd\t\xff\x93\xff\x83\xffd\x00(\xfeQ\xffM\x01\xb1\x01\xde\xfdE\xfd\xfe\xff\x00\x00\x06\x00\x02\xffV\xff\xcd\xffJ\xff\xfb\xfc\x86\xfd^\x00\x8d\x00\x91\xff\xb6\xfe\xf7\x00\x95\x01E\x00\x1b\xff9\xfe8\xff\xa7\xff\xd4\xff\xdd\xff\xb0\x00\x97\x01\xe8\x00\xa7\xff\xd8\xfe\x89\xff\x0c\x00\x81\xff\x81\xfe\xd1\xfeN\x00\x1a\x01\xcb\x00\x19\x00\x90\x00`\x00\x93\xff5\xff\x9b\xff\\\x00\x08\x00\xc0\xff,\x00\xc0\x00\xba\x00\x83\x00\x0f\x00\xf5\xffY\x00\x19\

然后我嘗試將 in_data 更改為 Float32,但這也不起作用:

in_data = np.frombuffer(in_data, np.float32))

我嘗試了各種數據裁剪和打包,但都沒有用:

in_data = np.clip(in_data, -2**15+1, 2**15-1)
in_data = struct.pack('d' * 1024, *in_data)

有誰知道如何從麥克風錄制音頻然后通過揚聲器錄制 output 嗎? 謝謝你。

設置FORMATOUT =FORMATIN


目前,您的代碼執行以下操作:

  • 每秒44100次,記錄一幀
  • 每幀都是一個 16 位有符號數(16 位 LPCM)。 編碼一幀需要 2 個字節。 這是您選擇的FORMATIN = pyaudio.paInt16設置。
  • 當記錄了 1024 幀時(大約需要 23 毫秒),這些幀將作為字節對象返回 python。它由 2048 字節組成。 你稱這個變量in_data
  • 然后,您通過.write調用將這 2048 個字節傳遞給 output 設備。
  • output 設備在pyaudio.paFloat32中工作,這意味着它認為每個幀都是 32 位(4 字節)。 它的結論是您提供了 2048/4=512 幀供其播放。 output 單元也設置為 44100Hz,因此播放大約需要 12 毫秒。 它播放的值一團糟,因為它試圖將整數解釋為浮點數。 比特率和編碼都不匹配,揚聲器中的聲音似乎來自煉獄中受折磨的靈魂。
  • 然后整個過程重復

匹配輸入和 output 格式應該可以解決這些問題。

具有 16 位帶符號的 integer 格式的音頻數據將具有介於 32768 和 -32767 之間的值。 具有浮點數(32 位或 64 位)的數據將在 1.0 到 -1.0 的范圍內。

我建議在 Python 中進行所有浮點處理。 因此,在處理或發送到 output 之前,請嘗試執行in_data = (in_data / 32768)

如果你使用 linux 你可以把os.system("pactl load-module module-loopback latency_msec=1")

在腳本的開頭和結尾的os.system("/usr/bin/pulseaudio --kill")

請告訴我它現在是否有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM