我通过python和pyaudio在我的电脑上录制了麦克风的声音。当声音以 16 位整数作为其数据类型记录时,它可以正常工作。但是,当它以 32 位浮点数作为其数据类型记录时,它不起作用。
请看下面的代码。如果 FORMAT 设置为 pyaudio.paInt16 它可以按我的意愿工作。但是,当它设置为 pyaudio.paFloat32 时它不起作用,如下所示;
import pyaudio
import wave
CHUNK = 1024
FORMAT = pyaudio.paFloat32
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 3
WAVE_OUTPUT_FILENAME = "path/to/output_file.wav"
p = pyaudio.PyAudio()
frames = []
stream = p.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,frames_per_buffer=CHUNK)
print("* recording")
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("* done recording")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
非常感谢您提前提供的建议和帮助!
更新;
我已经测试了 sounddevice 并且代码如下;
import sounddevice as sd
import wave
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "path/to/output.wav"
myrecording = sd.rec(int(RECORD_SECONDS * RATE), samplerate=RATE,
channels=CHANNELS, blocking=True, dtype='int16')
print(myrecording, 'myrecording')
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(2)
wf.setframerate(RATE)
wf.writeframes(myrecording)
wf.close()
结果与 pyaudio 相同。它在 int16 时有效,但在 32 位浮动作为 dtype 时会产生噪音和声音失真。