Записанный звук становится шумным / искаженным, когда тип данных 32-разрядный с плавающей запятой - PullRequest
0 голосов
/ 11 июля 2019

Я записал звук с микрофона на моем компьютере через 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()

Большое спасибо за совет и помощь заранее!

Update;

Я протестировал звуковое устройство и код следующий;

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.

...