VS语音信号处理(5) C语言PCM格式语音存为WAV格式语音工程实例
VS语音信号处理(5) C语言PCM格式语音存为WAV格式语音工程实例
- 前言
- 一. 工程实现
- 二. 生成编译
- 三. 小结
前言
语音识别相关算法一般在MATLAB上进行仿真验证与实验,在工程上一般还是在VS中进行实现落地,本系列将介绍语音信号处理在C语言中的一系列应用,后期将以此为基础,再落地移植到嵌入式平台。
今天介绍PCM格式语音存为WAV格式语音的工程应用。两种格式语音的唯一区别在于WAV语音包含文件头信息,而PCM格式语音仅包含语音数据流。语音格式转换也算是一种比较常见的应用,可以让我们更好的理解语音文件的格式信息。
一. 工程实现
打开VS2015
点击新建一个项目(工程),输入项目名:Pcm2wav
点击“确定”,创建项目
左侧解决方案资源管理器视图中,源文件栏右键添加新建项,
点击C++文件,新建一个源文件Pcm2wav.cpp,点击“添加”
输入代码如下:
// // Pcm2wav.cpp
// pcm格式语音转存为wav格式语音文件
// date:2022-5-9 22:32:21
// author : C.S#include <stdio.h>
#include <string.h>
#include <stdlib.h>#pragma warning (disable :4996)#define uint32_t unsigned int
#define uint16_t unsigned short typedef struct _riff_t {char riff[4]; /* "RIFF" (ASCII characters) */uint32_t len; /* Length of package (binary, little endian) */char wave[4]; /* "WAVE" (ASCII characters) */
} riff_t;/* The FORMAT chunk */typedef struct _format_t {char fmt[4]; /* "fmt_" (ASCII characters) */uint32_t len; /* length of FORMAT chunk (always 0x10) */uint16_t type; /* codec type*/uint16_t channel; /* Channel numbers (0x01 = mono, 0x02 = stereo) */uint32_t rate; /* Sample rate (binary, in Hz) */uint32_t bps; /* Average Bytes Per Second */uint16_t blockalign; /*number of bytes per sample */uint16_t bitpspl; /* bits per sample */
} format_t;typedef struct _data_t {char data[4]; /* "data" (ASCII characters) */uint32_t len; /* length of data */
}data_t;typedef struct _wav_head
{riff_t riff;format_t format;data_t data;
}wav_head;int main(int argc, char **argv)
{/*char src_file[128] = { 0 };char dst_file[128] = { 0 };*/char *src_file = "test.pcm";char *dst_file = "test.wav";int channels = 2;int bits = 16;int sample_rate = 48000;//以下是为了建立.wav头而准备的变量 wav_head header;FILE *fp, *fpCpy;printf("parameter analyse succeess\n");if ((fp = fopen(src_file, "rb")) == NULL) //读取文件 {printf("open pcm file %s error\n", argv[1]);return -1;}if ((fpCpy = fopen(dst_file, "wb")) == NULL) //为转换建立一个新文件 {printf("create wav file error\n");return -1;}//以下是创建wav头的HEADER;但.dwsize未定,因为不知道Data的长度。 memcpy(header.riff.riff, "RIFF", 4);memcpy(header.riff.wave, "WAVE", 4);//以上是创建wav头的HEADER; if (ferror(fpCpy)){printf("error\n");}memcpy(&header.format.fmt, "fmt ", 4);header.format.len = 0x10;header.format.type = 0x1;header.format.channel = channels;header.format.rate = sample_rate;header.format.bps = sample_rate * bits / 8 * channels;header.format.blockalign = bits / 8 * channels;header.format.bitpspl = bits;memcpy(&header.data.data, "data", 4);fseek(fp, 0, SEEK_END);long count = ftell(fp);fseek(fp, 0, SEEK_SET);printf("length:%ud", count);header.data.len = (uint32_t)count;header.riff.len = header.data.len + 36;int size = sizeof(header);fwrite(&header, sizeof(header), 1, fpCpy);char *buffer = (char *)malloc((count) * sizeof(char));fread(buffer, 1, count, fp);fwrite(buffer, 1, count, fpCpy);free(buffer);fclose(fp); //关闭文件 fclose(fpCpy); //关闭文件 return 0;
}
二. 生成编译
点击目录栏“生成”中“生成解决方案”
生成成功!找一个PCM格式语音,命名为test.pcm,放在Pcm2wav.cpp同目录下,点击调试运行,生成一个test.wav文件,调用成功。
可以看到生成的test.wav大小与test.pcm基本相同,即WAV语音数据生成成功。
三. 小结
最近项目上需要对语音信号进行处理,这个是对语音格式进行转换的工程,相对也比较简单,值得注意的是,如果没有将test.pcm导入的话,工程不会报警提示,所以有需要的同学在应用的时候需要注意一下,没有源语音是得不到wav语音的。另外,进行变换前需确认PCM格式语音的采样率,通道数,位数等信息,否则生成的WAV语音听起来将会变调失真。
VS语音信号处理(5) C语言PCM格式语音存为WAV格式语音工程实例相关推荐
- Golang 提取视频中音频,存为WAV格式 | Golang工具
目录 前言 环境依赖 代码 总结 前言 本文提供将视频中音频提取出来存为wav格式,一如既往的实用主义. 主要也是学习一下golang使用ffmpeg工具的方式. 环境依赖 ffmpeg环境安装,可以 ...
- c语言 输出音频 单片机,单片机播放WAV格式音频的理解
CSDN账号注册了3年,一直没有上来过,更不用说写博客了.我不知道博客的具体用途,我只想把它当做一种心得来发表,可能是一些技术上的理解或者生活上的小故事.好了,下面我将记录我对WAV播放器的理解. 很 ...
- python批量音频转格式_python将mp3格式批量转化为wav格式
语音识别无论是接口还是开源的项目,大多情况下都需要将语音格式转化为wav格式. 首先,需要安装pydub库,pip install pydub 就行. 接下来将你需要转化的mp3文件放入文件夹,创建好 ...
- java生成wav格式文件_Python--生成Wav格式文件
1.下载与安装scipy 2.wav文件写操作 3.signal.chirp函数使用说明 4.点击按钮实现信号生成,点击按钮实现信号显示 5.Python代码 #!usr/bin/env python ...
- VS语音信号处理(2) C语言分段读取WAV语音文件语音数据
VS语音信号处理(2) C语言分段读取WAV语音文件语音数据 前言 一. 工程实现 二. 结果 三. 小结 前言 语音识别相关算法一般在MATLAB上进行仿真验证与实验,在工程上一般还是在VS中进行实 ...
- VS语音信号处理(6) C语言调用SoundTouch进行变速不变调工程实例
VS语音信号处理(6) C语言调用SoundTouch进行变速不变调工程实例 前言 一. 源码下载即链接库准备 二. 工程编译准备 三. 例程实现 四. 小结 前言 语音识别相关算法一般在MATLAB ...
- VS语音信号处理(7) C语言调用SoundTouch进行变速不变调工程集成调试
VS语音信号处理(7) C语言调用SoundTouch进行变速不变调工程集成调试 前言 一. 源码下载即链接库准备 二. 工程编译准备 三. 例程实现 四. 小结 前言 语音识别相关算法一般在MATL ...
- 基于MATLAB的语音信号处理系统的设计
目 录 摘 要 I Abstract II 1 绪论 1 2 语音信号处理系统设计方案 2 2.1MATLAB的说明 2 2.2系统框架及实现流程图 2 2.2.1系统框架: 2 2.2.2系统流程图 ...
- QQ语音消息转换成WAV格式
原创文|Space9 问题背景 QQ已经成为我们生活中的一部分,在QQ上留下了我们许多美好的回忆,一段动听的音乐,或是一句甜蜜的话语,都能触动我们的内心.腾讯使用的语音文件是经过特殊编码(Silk V ...
- 波束形成、回声消除、声源定位及端到端等语音信号处理算法
现今信息技术飞速发展,语音技术源源不断地融入到各个领域,语音信号处理是人机接口的关键技术,已广泛应用于直播.在线通话.智能音箱等产品中. (落地应用) 随着语音产品广泛落地应用,语音行业飞速发展,各大 ...
最新文章
- ASP .NET Core Web Razor Pages系列教程四:使用数据库进行交互(SqlServer 版)
- 10进制转换成16进制
- 0027-如何在CDH集群启用Kerberos
- Java自定义注解Annotation的实现原理
- python ctypes 回调函数_Python ctypes中具有自定义类型的回调
- Spring Boot是什么
- html任务3 模拟滚动条,vue3系列:vue3.0自定义虚拟滚动条V3Scroll|vue3模拟滚动条组件...
- 【Python3】Tensorflow_Fasterrcnn训练自己数据集,Keras_Yolov3_GPU训练自己数据集
- 多态和类属性、类方法
- Tensorflow——Dropout(解决过拟合问题)
- 易筋SpringBoot 2.1 | 第十篇:SpringBoot使用thymeleaf入门
- Spring Boot接支付宝第三方支付(沙箱)
- 基于单片机的超市储物柜设计_基于51单片机的超市自动储物柜的设计,求大佬指点?...
- android自定义六边形,Android实现六边形图像
- 17 RFID卡的读写
- 中国历代大大小小的皇帝(2)
- ArcGIS 矢量数据的空间校正和橡皮页变换
- 一百年沧桑巨变,数学大树依然长青
- windows 11 访问带SMB的文件服务器(小米路由器)
- php顺丰bsp订单跟踪,顺丰BSP接口PHP开发注意事项