如何将Pyaudio的输出写入音频文件?

6

我目前有以下代码,使用pyaudio模块生成一个变频率的正弦波:

import pyaudio
import numpy as np

p = pyaudio.PyAudio()

volume = 0.5
fs = 44100
duration = 1

f = 440

samples = (np.sin(2 * np.pi * np.arange(fs * duration) * f / 
fs)).astype(np.float32).tobytes()

stream = p.open(format = pyaudio.paFloat32,
                channels = 1,
                rate = fs,
                output = True)

stream.write(samples)

但是,除了播放声音之外,有没有办法将声音写入音频文件中?


你找到解决这个问题的方法了吗?我在保存paFloat32为.wav文件时得到了嘈杂的文件。 - Matias
2
@Matias 对不起,我没有及时回复。我刚刚写的答案生成了一个没有噪音的文件。 - George Tian
3个回答

3

使用 @h lee 建议的 scipy.io.wavfile.write 产生了期望的结果:

import numpy
from scipy.io.wavfile import write

volume = 1
sample_rate = 44100
duration = 10
frequency = 1000

samples = (numpy.sin(2 * numpy.pi * numpy.arange(sample_rate * duration)
     * frequency / sample_rate)).astype(numpy.float32)

write('test.wav', sample_rate, samples)

另一个示例可以在文档中找到:https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.wavfile.write.html


2
将以下代码添加到您的代码顶部。
from scipy.io.wavfile import write

此外,在您的代码底部添加以下代码。这对我有效。
scaled = numpy.int16(s/numpy.max(numpy.abs(s)) * 32767)
write('test.wav', 44100, scaled)

1

像我在这里的第二个答案中所做的那样,将音频输入处理为numpy数组,但是不仅要处理帧并将数据发送回PyAudio,还要将每个帧保存在新的output_array中。然后,在处理完成后,您可以使用该output_array将其写入.wav或.mp3文件。

如果您这样做,声音仍然会播放。如果您不想播放声音,则有两个选择,要么使用阻塞模式,要么,如果您想坚持使用非阻塞模式和回调,请执行以下操作:

  • 删除output=True,使其默认为False
  • 添加一个input=True
  • 参数。
  • 在回调中,不要返回ret_data,而是返回None
  • 计算您已处理的帧数,以便在完成时将paComplete作为返回元组的第二个值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接