wav文件头信息
概述
迩来在对接百度TTS的python接口,对接的历程中发觉一些成绩,纪录下处理方案。
百度TTS接口前往的音频数据格式有4种,分散是mp3,pcm-16k,pcm-8k,wav(pcm-16k)。
我们必要的后果是wav(pcm-8k)。
需求对齐后,分析处理方案,主要有以下几个选择。
1, mp3转码为wav,好比python库AudioSegment。
2, wav(pcm-16k)重采样为wav(pcm-8k),好比python库wave。
3, pcm-8k转换为wav格式,好比python库wave。
4, pcm-8k手动增长wav格式头信息,写入文件。
今天选择第4种方案,并特地复习了一下wav格式的头部信息。
情况
python 3.10.3
wav文件格式
先复习一下wav文件的格式信息。
底下的截图是依据我的了解画的,仅仅针对pcm编码格式,其他紧缩编码格式会多一个fact chunk(在fmt chunk和data chunk正中),有兴致的可以自行查找材料。
源码
之前用c写过wav的头文件信息,用python照旧第一次。
此中aip是百度tts的python库,struct是python内建模块,用于python字符串和C言语布局体之间的转换,我们用struct库对字符串和整数做序列化。
#required python3
from aip import AipSpeech
from struct import pack
def tts_baidu(content, filename):
#init client
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
## aue:3-mp3, 4-pcm-16k, 5-pcm-8k, 6-wav(pcm-16k)
result = client.synthesis(text = content, lang = 'zh', ctp = 1, options = {'aue': 5, 'per': 0, 'vol': 5})
# 识别准确前往语音二进制 错误则前往dict 参照底下错误码
if not isinstance(result, dict):
with open(filename, 'wb') as f:
##aue use 5-pcm-8k, write wav header info first
header = ''
header = pcm_wav_head(len(result), header)
f.write(header)
f.write(result)
f.close()
else:
raise Exception("tts fail, %s" % str(result))
return
###ONLY for pcm, 8000 sample, 16bits, 1 channel
def pcm_wav_head(data_len, header = ''):
header = b'RIFF' #WAVE DES, 4
header = pack('I', (data_len 36)) #wav chunk len, 4
header = b'WAVE' # WAVE, 4
header = b'fmt ' #fmt , 4
header = pack('I', 16) #PCM fmt info len, 4
header = pack('H', 1) #fmt type PCM 0x0001, 2
header = pack('H', 1) #1 channel, 2
header = pack('I', 8000) #sample 8000, 4
header = pack('I', int(1 * 8000 * 16 / 8)) #bytes per second, 4
header = pack('H', int(1 * 16 / 8)) #sampling frame size, 2
header = pack('H', 16) #bit depth, 2
header = b'data' #data
header = pack('I', data_len) #data len
return header
if __name__ == "__main__":
content = '123456'
filename = r'C:\Users\12345\Desktop\101.wav'
tts_baidu(content, filename)
测试
发送tts哀求,依据前往后果写wav文件,wav文件用UE掀开,见截图。
截图中,我们可以看到几个数据段的标识,“RIFF“,”WAVEfmt “,”data“。
总结
简便复习了一下wav格式的头部信息,愈加繁复的编解码和紧缩格式头部信息也都可以在网上找到具体的形貌。
wav是一个封装格式,封包的信息都在wav头中。
pcm编码格式是不紧缩的语音编码格式,封装pcm数据的wav文件格式相对简便,关于了解音频文件的打包封装有一定协助。
空空如常
求真得真