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

问题描述 投票:0回答:2

我正在尝试播放锯齿波发出的声音。我使用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:格式,子类型和字节序的无效组合

python audio wav
2个回答
1
投票

我认为撰写本教程的人走了很长一段路。有一种更简单的方法可以将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()方法毫无问题地读取此文件


1
投票

令人惊讶的是,基础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吗?

或者您可以创建一个RAW文件(即无标题的文件,不包含有关其自身数据格式的信息),这恰好是他们在您提到的教程中所做的(请注意,他们正在使用以下选项:-t raw -e signed -b 8)。

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

© www.soinside.com 2019 - 2024. All rights reserved.