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文件格式相对简单,对于理解音频文件的打包封装有一定帮助。
空空如常
求真得真
wav文件头信息的更多相关文章
- sublime 设置新建文件自动添加author(作者)等文件头信息
很多时候, sublime 自带自动添加文件头信息, 但是并不是我们想要比如下面这样的:新建一个python文件 自动添加的author 信息== 上面并不是我想要的, 我想要下面这样的效果:== 这 ...
- 给pcm格式文件加wav文件头
#include <stdlib.h>#include <stdio.h>#include <string.h>void main(){ //wav头的结构如下所示 ...
- eclipse快速配置spring相关xml文件头信息
通过spring tools 插件工具来快速配置xml头信息 ctrl +n 创建-----------> 输入spring 选中spring Beann Configuration File ...
- FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe
一.简述 ffprobe是ffmpeg命令行工具中相对简单的,此命令是用来查看媒体文件格式的工具. 二.命令格式 在命令行中输入如下格式的命令: ffprobe [文件名] 三.使用ffprobe查看 ...
- Pycharm中.py文件头信息配置
在社区版的Pycharm开发软件中设置每次新建.py文件都会自动生成如下信息 #! /usr/bin/env python # -*- coding:utf-8 -*- # Author: Tdcqm ...
- WAV文件头相关资料
http://stackoverflow.com/questions/6284651/avaudiorecorder-doesnt-write-out-proper-wav-file-header h ...
- DCMTK读取DICOM文件头信息的三种方法
Howto: Load File Meta-Header Here's an example that shows how to load the File Meta Information Head ...
- php通过文件头检测文件类型通用类(zip,rar…)(转)
在做web应用时候,通过web扩展名判断上存文件类型,这个是我们常使用的.有时候我们这样做还不完善.可能有些人上存一些文件,但是他通过修改 扩展名,让在我们的文件类型之内. 单实际访问时候又不能展示( ...
- java通过文件头来判断文件类型
import java.io.FileInputStream; import java.io.IOException; import java.util.HashMap; import java.ut ...
- pycharm新建py文件时,自动补充文件头注释信息
步骤: 1.File -->Settings 2.选择 File and Code Templates -> Files -> Python Script 文件头注释信息代码样式: ...
随机推荐
- [USACO2007FEBS] Cow Party S
题目描述 寒假到了,\(n\) 头牛都要去参加一场在编号为 \(x\) 的牛的农场举行的派对,农场之间有 \(m\) 条有向路,每条路都有一定的长度. 每头牛参加完派对后都必须回家,无论是去参加派对还 ...
- 如何生成core文件进行项目调试
由于项目前期的调试错误比较多,或者有某些隐藏危险:例如内存泄漏:偶尔才出现一次,如果没有捕捉错误的手段可能好不容易出现的机会就溜走了,所以生成core文件是必要的,发生段错误会生成相应的core文件, ...
- Hexo 主题开发之自定义模板
关于 Hexo 如何开发主题包的教程在已经是大把的存在了,这里就不在赘述了.这边文章主要讲的是作为一个主题的开发者,如何让你的主题具有更好的扩展性,在用户自定义修改主题后,能够更加平易升级主题. 问题 ...
- ceph集群搭建详细教程(ceph-deploy)
ceph-deploy比较适合生产环境,不是用cephadm搭建.相对麻烦一些,但是并不难,细节把握好就行,只是命令多一些而已. 实验环境 服务器主机 public网段IP(对外服务) cluster ...
- 华企盾DSC防泄密:有一个文件申请解密失败,提示拒绝访问(密钥不对)
解决方法:将文件拖到加密进程中提示密钥不对,找到原来的数据库还原解密
- Python——第五章:time模块、datetime模块
time模块 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime,calendar(很少用,不讲),下面分别来介绍. 我们写程序时对时间 ...
- 【Python】【OpenCV】OCR识别(二)——透视变换
对于OCR技术在处理有角度有偏差的图像时是比较困难的,而水平的图像使用OCR识别准确度会高很多,因为文本通常是水平排列的,而OCR算法一般会假设文本是水平的. 针对上述情况,所以我们在处理有角度的图象 ...
- STM32CubeMX教程13 ADC - 单通道转换
1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) ST-LINK/V2驱动 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK ...
- Terraform 的开源替代:OpenTofu 宣布 GA!
OpenTofu 社区于1月10日宣布 OpenTofu 项目 GA,这是 OpenTofu 的首个稳定版本(https://github.com/opentofu/opentofu/releases ...
- Java中递归的简单应用
递归是一种非常常见的编程技巧,它可以将一个复杂的问题分解成更小的问题,然后递归地解决这些小问题,最终得到整个问题的解.递归的本质就是函数调用自身. 我们来看一个简单的例子:计算阶乘.阶乘是指将一个数和 ...