【问题标题】:PyAudio Recording and Playing Back in Real TimePyAudio 实时录制和回放
【发布时间】:2021-03-09 21:26:56
【问题描述】:

我正在尝试从麦克风录制音频,然后通过扬声器播放该音频。最终我想在播放之前修改音频,但我无法获取输入数据并通过扬声器成功播放。

我使用的输入流的格式是 Int16,输出流的格式是 Float32。这些是唯一能发出任何声音的(尽管是恶魔般的)。

首先,我尝试简单地将输入数据放入输出流。这会输出恶魔般的声音:

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)

有谁知道如何从麦克风录制音频,然后通过扬声器输出?谢谢。

【问题讨论】:

    标签: python audio pyaudio audio-processing portaudio


    【解决方案1】:

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

    在脚本的开头和 os.system("/usr/bin/pulseaudio --kill") 最后

    请告诉我它现在是否有效

    【讨论】:

    • 我没有使用 linux。 mac有什么用吗?
    • 你可以尝试在python脚本录制的同时打开播放你录制的内容的软件
    • 这就是我想要做的。使用 python 听麦克风并播放它通过扬声器听到的内容。也许 pyaudio 不是一个很好的库?
    【解决方案2】:

    16 位有符号整数格式的音频数据的值介于 32768 和 -32767 之间。浮点数(32 位或 64 位)的数据将在 1.0 到 -1.0 的范围内。

    我建议在 Python 中使用浮点数进行所有处理。所以在处理或发送到输出之前尝试做in_data = (in_data / 32768)

    【讨论】:

    • 我以为这就是 np.frombuffer(in_data, np.float32) 所做的?无论哪种方式, in_data 都是字节格式,因此该操作不起作用。谢谢你的评论顺便说一句
    • 字节格式?该数据的格式是什么? 16位PCM?我在 pyaudio 文档中没有找到太多...
    • 我不知道它叫什么。我在我的帖子正文中放置了一个 in_data 的样例。你知道这是什么吗?是的,当涉及到这样的细节时,pyaudio 文档非常糟糕。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多