当前位置: 代码迷 >> python >> 如何将pyaudio输出写入音频文件?
  详细解决方案

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

热度:52   发布时间:2023-06-27 21:20:34.0

我目前有以下代码,它使用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)

但是,不是播放声音,而是有什么方法可以将声音写入音频文件?

将此代码添加到代码顶部。

from scipy.io.wavfile import write

此外,将此代码添加到代码底部。 这对我有用。

scaled = numpy.int16(s/numpy.max(numpy.abs(s)) * 32767)
write('test.wav', 44100, scaled)

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

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

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

按照@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)

另一个例子可以在文档中找到: :