概述

最近在对接百度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文件头信息的更多相关文章

  1. sublime 设置新建文件自动添加author(作者)等文件头信息

    很多时候, sublime 自带自动添加文件头信息, 但是并不是我们想要比如下面这样的:新建一个python文件 自动添加的author 信息== 上面并不是我想要的, 我想要下面这样的效果:== 这 ...

  2. 给pcm格式文件加wav文件头

    #include <stdlib.h>#include <stdio.h>#include <string.h>void main(){ //wav头的结构如下所示 ...

  3. eclipse快速配置spring相关xml文件头信息

    通过spring tools 插件工具来快速配置xml头信息 ctrl +n 创建-----------> 输入spring 选中spring Beann Configuration File ...

  4. FFmpeg命令行工具学习(一):查看媒体文件头信息工具ffprobe

    一.简述 ffprobe是ffmpeg命令行工具中相对简单的,此命令是用来查看媒体文件格式的工具. 二.命令格式 在命令行中输入如下格式的命令: ffprobe [文件名] 三.使用ffprobe查看 ...

  5. Pycharm中.py文件头信息配置

    在社区版的Pycharm开发软件中设置每次新建.py文件都会自动生成如下信息 #! /usr/bin/env python # -*- coding:utf-8 -*- # Author: Tdcqm ...

  6. WAV文件头相关资料

    http://stackoverflow.com/questions/6284651/avaudiorecorder-doesnt-write-out-proper-wav-file-header h ...

  7. DCMTK读取DICOM文件头信息的三种方法

    Howto: Load File Meta-Header Here's an example that shows how to load the File Meta Information Head ...

  8. php通过文件头检测文件类型通用类(zip,rar…)(转)

    在做web应用时候,通过web扩展名判断上存文件类型,这个是我们常使用的.有时候我们这样做还不完善.可能有些人上存一些文件,但是他通过修改 扩展名,让在我们的文件类型之内. 单实际访问时候又不能展示( ...

  9. java通过文件头来判断文件类型

    import java.io.FileInputStream; import java.io.IOException; import java.util.HashMap; import java.ut ...

  10. pycharm新建py文件时,自动补充文件头注释信息

    步骤: 1.File -->Settings 2.选择 File and Code Templates -> Files -> Python Script 文件头注释信息代码样式: ...

随机推荐

  1. [AGC59C] Guessing Permutation for as Long as Possible

    Problem Statement A teacher has a hidden permutation $P=(P_1,P_2,\ldots,P_N)$ of $(1,2,\cdots,N)$. Y ...

  2. Oracle-startup和shutdown

    startup不同参数作用 startup nomount 非安装启动,以这种方式启动可执行: 1.重建控制文件. 2.重建数据库读取init.ora文件. 3.启动实例,即启动SGA和后台进程,需要 ...

  3. python操作mongodb实现读写分离

    读写分离 默认情况下,MongoClient 实例将查询发送到副本集的主要成员. 要使用副节点作为查询,以实现读写分离,我们必须更改读取首选项: 读取首选项在模块pymongo.ReadPrefere ...

  4. Feign源码解析:初始化过程(三)

    背景 前面两篇讲了下,在一个典型的引入了feign.loadbalancer.nacos等相关依赖的环境中,会有哪些bean需要创建. 其中第一篇讲了非自动配置的bean,第二篇是自动配置的bean. ...

  5. CSS3学习笔记引言

    开始我们要来介绍css: CSS(全称为Cascading Style Sheets)是一种用于描述HTML.XML等文档样式的样式语言,它能够定义元素的显示方式,如字体.颜色.布局等. CSS可以把 ...

  6. Typora 掘金小册主题

    主题说明 此主题样式基本来源于掘金小册学习界面 下载地址:https://github.com/easylee1996/typora-juejin-theme 主题预览 主题文档示例 如何使用 克隆仓 ...

  7. VSCode C++开发环境配置:CMake 调试配置 launch.json

    相关内容 VSCode C++开发环境配置: LLVM clang clangd 安装 cmake sudo apt install cmake 安装 VSCode 插件 CMake CMakeToo ...

  8. 技术实践丨手把手教你使用MQTT方式对接华为IoT平台 华为云开发者社区

    摘要:本文主要讲述使用MQTT方式对接华为云IoT平台的具体过程. 使用的方案:目标板为STM32L431BearPI(带E53扩展板); TCPIP功能由开发板的ESP8266提供:MQTT使用Pa ...

  9. 整理混乱的头文件,我用include what you use

    摘要:使用include-what-you-use(iwyu/IWYU)清理冗余头文件,补充必要头文件. 本文分享自华为云社区<用include what you use拯救混乱的头文件> ...

  10. 华为云企业级Redis揭秘第17期:集群搭载多DB,多租隔离更降本

    摘要:GaussDB(for Redis)支持真正可扩展的多DB,轻松实现降本增效. 本文分享自华为云社区<华为云企业级Redis揭秘第17期:集群搭载多DB,多租隔离更降本>,作者: G ...