如何在Python中用8位编码16位WAV文件?

2024-10-03 17:17:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试着播放锯齿波的声音。我用Python创建了波形,并能够将其保存为WAV文件,但当我尝试播放它时,它会说该文件无法播放,因为文件类型不受支持,文件扩展名不正确,或者文件已损坏。我使用了这个人的教程(https://thehackerdiary.wordpress.com/2017/06/09/it-is-ridiculously-easy-to-generate-any-audio-signal-using-python/),他们用Audacity将原始波形从16位编码到8位,从而解决了这个问题。如何仅使用Python实现这一点

import soundfile

data, samplerate = soundfile.read('sawtooth_100_hz.wav')
soundfile.write('sawtooth_100_hz_8bit.wav', data, samplerate, subtype='PCM_S8')

^^我尝试了此操作,但出现以下错误:ValueError:格式、子类型和endian的组合无效


Tags: 文件https声音data教程文件类型波形wav
3条回答

听起来您只是想从Python中生成示例和播放

如果是这样的话,库“sounddevice”似乎可以让您将样本直接写入音频设备:

https://python-sounddevice.readthedocs.io/en/0.3.15/usage.html#playback

我现在不在python环境中,所以还没有测试,但将其与示例代码混合使用只会是:

import sounddevice as sd
import numpy as np

sampling_rate = 44100
freq = 440
samples = 44100

x = np.arange(samples)
y = 100*np.sin(2 * np.pi * freq * x / sampling_rate)

sd.play(y, sampling_rate)

Sounddevice的作者是如此,请参见他对类似问题的回答:https://stackoverflow.com/a/34179010/1339735

您可能需要进行一些缩放-不确定它是否像大多数浮点播放一样接受从-1到1的值,或者像您的示例中的+/-100

我认为写这篇教程的人走了很长的路。有一种更简单的方法可以将NumPy数组转换为wav文件,下面使用该方法生成与教程中生成的wav文件相同的wav文件:

import numpy as np
from scipy.io import wavfile

sampling_rate = 44100
freq = 440
samples = 44100

x = np.arange(samples)
y = 100*np.sin(2 * np.pi * freq * x / sampling_rate)

wavfile.write("test.wav", sampling_rate, y)

您可以使用wavfile.read()方法毫无问题地读取此文件

令人惊讶的是,底层libsndfile库不支持带有有符号8位样本(仅无符号)的WAV文件,请参见http://www.mega-nerd.com/libsndfile/#Features

您还可以使用soundfile模块检查这一点:

>>> import soundfile as sf
>>> sf.available_subtypes('wav')
{'PCM_16': 'Signed 16 bit PCM', 'PCM_24': 'Signed 24 bit PCM', 'PCM_32': 'Signed 32 bit PCM', 'PCM_U8': 'Unsigned 8 bit PCM', 'FLOAT': '32 bit float', 'DOUBLE': '64 bit float', 'ULAW': 'U-Law', 'ALAW': 'A-Law', 'IMA_ADPCM': 'IMA ADPCM', 'MS_ADPCM': 'Microsoft ADPCM', 'GSM610': 'GSM 6.10', 'G721_32': '32kbs G721 ADPCM'}

你可以试着用AIFF或FLAC来代替

或者您可以创建一个原始文件(即,一个不包含任何关于其自身数据格式信息的无头文件),这是他们在您提到的教程中所做的(请注意,他们正在使用这些选项:-t raw -e signed -b 8

有关创建和播放信号的更多信息,请参阅:

相关问题 更多 >