1

我正在创建一个嵌入式压缩系统,类似于专业音频混音器上的那些。我正在PyAudio通过给定的“wire”示例捕获音频样本。

会发生什么

由于库,这些样本被分成“块”,并在录制后不久进行流式传输。如果输入信号变得太大,我只是尝试压缩块。但是,存在不匹配的类型。

正在使用的类型是:

  • 数据 = 流中的样本<type 'str'>- Unicode 字符串
  • chunk = 一批音频字节<type 'int'>-总是返回 1024
  • stream.write(数据,块)<type 'NoneType'>
  • compressed_segment = 被压缩<class 'pydub.audio_segment.AudioSegment'>

发生了什么

PyAudiostringstream.read()存储在data. 我需要能够将这些字符串样本转换为 AudioSegment 对象才能使用压缩功能。

结果,最终发生的事情是我收到了几个与类型转换相关的错误,这取决于我如何设置所有内容。我知道这不是正确的类型。那么我怎样才能使这种类型转换工作呢?

这是我尝试在for i in range循环中进行转换的两种方法

1.在压缩前创建一个“波浪”对象

wave_file = wave.open(f="compress.wav", mode="wb")
wave_file.writeframes(data)
frame_rate = wave_file.getframerate()
wave_file.setnchannels(2)
# Create the proper file
compressed = AudioSegment.from_raw(wave_file)
compress(compressed) # Calling compress_dynamic_range in Pydub

异常 wave.Error: Error('# channels not specified',) in <bound method Wave_write. <wave.Wave_write instance at 0x000000000612FE88>> 的del被忽略

2.发送RAW PyAudio数据压缩方法

data = stream.read(chunk)
compress(chunk) # Calling compress_dynamic_range in Pydub

thresh_rms = seg.max_possible_amplitude * db_to_float(threshold) AttributeError: 'int' object has no attribute 'max_possible_amplitude'

4

1 回答 1

1

由于设置了之前写入的波形文件而引发的第一个错误# of channels可以修复如下:

# inside for i in range loop 
wave_file = wave.open(f="compress.wav(%s)" %i, mode="wb")
wave_file.setnchannels(channels)
wave_file.setsampwidth(sample_width)
wave_file.setframerate(sample_rate)
wave_file.writeframesraw(data) # place this after all attributes are set
wave_file.close()

# send temp files to compressor
compressed = AudioSegment.from_raw(wave_file)
compress(compressed)

然后可以将其发送到 PyDub 功能compress_dynamic_range

然而...

一种更有效的方法(无需创建临时wav文件)是按以下方式创建一个简单的 AudioSegment 对象。还可以使用stream.write().

sound = AudioSegment(data, sample_width=2, channels=2, frame_rate=44100)
stream.write(sound.raw_data, chunk) # stream via speakers / headphones
于 2017-11-28T17:18:57.253 回答