如何将pyaudio输出写入音频文件?
How to write pyaudio output into audio file?
我目前有以下代码,它使用 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)
但是,有什么方法可以将声音写入音频文件,而不是播放声音?
像我一样将您的音频输入作为 numpy 数组处理 here in the second answer,但不是只处理帧并将数据发送回 PyAudio,而是将每个帧保存在一个新的 output_array
中。然后当处理完成后,您可以使用 output_array
将其写入 .wav 或 .mp3 文件。
但是,如果您这样做,声音仍会播放。如果你不想播放声音,你有两个选择,要么使用阻塞模式,要么,如果你想坚持使用非阻塞模式和回调,请执行以下操作:
- 擦除
output=True
,使其默认为 False
。
- 添加一个
input=True
参数。
- 在您的回调中不要 return
ret_data
,而是 return None
。
- 记录您已处理的帧数,以便在您完成后 return
paComplete
作为 returned 元组的第二个值。
在您的代码顶部添加此代码。
from scipy.io.wavfile import write
此外,将这段代码添加到您的代码底部。
这对我有用。
scaled = numpy.int16(s/numpy.max(numpy.abs(s)) * 32767)
write('test.wav', 44100, scaled)
按照@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
我目前有以下代码,它使用 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)
但是,有什么方法可以将声音写入音频文件,而不是播放声音?
像我一样将您的音频输入作为 numpy 数组处理 here in the second answer,但不是只处理帧并将数据发送回 PyAudio,而是将每个帧保存在一个新的 output_array
中。然后当处理完成后,您可以使用 output_array
将其写入 .wav 或 .mp3 文件。
但是,如果您这样做,声音仍会播放。如果你不想播放声音,你有两个选择,要么使用阻塞模式,要么,如果你想坚持使用非阻塞模式和回调,请执行以下操作:
- 擦除
output=True
,使其默认为False
。 - 添加一个
input=True
参数。 - 在您的回调中不要 return
ret_data
,而是 returnNone
。 - 记录您已处理的帧数,以便在您完成后 return
paComplete
作为 returned 元组的第二个值。
在您的代码顶部添加此代码。
from scipy.io.wavfile import write
此外,将这段代码添加到您的代码底部。 这对我有用。
scaled = numpy.int16(s/numpy.max(numpy.abs(s)) * 32767)
write('test.wav', 44100, scaled)
按照@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