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 文件头注释信息代码样式: ...
随机推荐
- Redis 学习笔记2:持久化
目录 1 什么是持久化 1.1 aof 1.2 rdb 2 RDB持久化 2.1 RDB 是什么 2.2 手动触发 3 AOF持久化 3.1 aof 是什么 3.2 appendfile 文件说明: ...
- SpringBoot事件机制
1.是什么? SpringBoot事件机制是指SpringBoot中的开发人员可以通过编写自定义事件来对应用程序进行事件处理.我们可以创建自己的事件类,并在应用程序中注册这些事件,当事件被触发时,可以 ...
- 最好用的AI换脸软件,rope下载介绍
随着AI技术的广泛运用,市面上的换脸软件也多了起来,今天给各位介绍其中的王者Rope! 先上两个动图,给大伙看看效果 rope是如何实现这种自然的效果呢?这得益于机器学习技术的不断发展,rope经过深 ...
- 使用create-vue创建vue3项目
create-vue是vue3新的脚手架搭建项目工具,底层构建工具使用vite,而不是vue-cli的webpack. 但不是说你不能用以前的vue create命令来创建vue3项目,你完全可以用v ...
- 年度盘点,四年的精华合集「GitHub 热点速览」
今年是 GPT 年,无论是 GitHub 还是朋友圈还是技术平台,即便你不关心 GPT 的发展情况,同大模型.AI 相关的项目总能进入你的信息流.到这期为止,热度速览也连载了四年,从一开始习惯看 Gi ...
- Git和Github库详细使用教程
SVN 是集中式或者有中心式版本控制系统,版本库是集中放在中央服务器的; Git 是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为 ...
- Win10笔记本开启热点让手机上网
Win10开启热点让手机上网,笔记本电脑开启热点,笔记本电脑开启WiFi,手机连接笔记本电脑热点上网. 1.前提条件:笔记本电脑网线联网,笔记本电脑支持热点 2.胆子要大,不怕公司网管统计发现你的电脑 ...
- 5分钟搞定vue3函数式弹窗
前言 最近接到一个需求,需要在一些敏感操作进行前要求输入账号和密码,然后将输入的账号和密码加到接口请求的header里面.如果每个页面都去手动导入弹窗组件,在点击按钮后弹出弹窗.再拿到弹窗返回的账号密 ...
- react 事件函数中 this 绑定问题
在使用类方式创建组件时,类中定义一个函数,并且绑定到元素的点击事件上,此时这个函数中this指向并不是当前这个组件. 组件代码如下: class App extends React.Component ...
- 当 BACnet 遇上 IoT,你将体验到不一样的大楼
本文分享自华为云社区<当 BACnet 遇上 IoT>,作者:美码师zale . 引言 在十四五规划中,"新基建"无疑是倍受关注的重点领域.而关于"新基建&q ...