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格式语音工程实例相关推荐

  1. Golang 提取视频中音频,存为WAV格式 | Golang工具

    目录 前言 环境依赖 代码 总结 前言 本文提供将视频中音频提取出来存为wav格式,一如既往的实用主义. 主要也是学习一下golang使用ffmpeg工具的方式. 环境依赖 ffmpeg环境安装,可以 ...

  2. c语言 输出音频 单片机,单片机播放WAV格式音频的理解

    CSDN账号注册了3年,一直没有上来过,更不用说写博客了.我不知道博客的具体用途,我只想把它当做一种心得来发表,可能是一些技术上的理解或者生活上的小故事.好了,下面我将记录我对WAV播放器的理解. 很 ...

  3. python批量音频转格式_python将mp3格式批量转化为wav格式

    语音识别无论是接口还是开源的项目,大多情况下都需要将语音格式转化为wav格式. 首先,需要安装pydub库,pip install pydub 就行. 接下来将你需要转化的mp3文件放入文件夹,创建好 ...

  4. java生成wav格式文件_Python--生成Wav格式文件

    1.下载与安装scipy 2.wav文件写操作 3.signal.chirp函数使用说明 4.点击按钮实现信号生成,点击按钮实现信号显示 5.Python代码 #!usr/bin/env python ...

  5. VS语音信号处理(2) C语言分段读取WAV语音文件语音数据

    VS语音信号处理(2) C语言分段读取WAV语音文件语音数据 前言 一. 工程实现 二. 结果 三. 小结 前言 语音识别相关算法一般在MATLAB上进行仿真验证与实验,在工程上一般还是在VS中进行实 ...

  6. VS语音信号处理(6) C语言调用SoundTouch进行变速不变调工程实例

    VS语音信号处理(6) C语言调用SoundTouch进行变速不变调工程实例 前言 一. 源码下载即链接库准备 二. 工程编译准备 三. 例程实现 四. 小结 前言 语音识别相关算法一般在MATLAB ...

  7. VS语音信号处理(7) C语言调用SoundTouch进行变速不变调工程集成调试

    VS语音信号处理(7) C语言调用SoundTouch进行变速不变调工程集成调试 前言 一. 源码下载即链接库准备 二. 工程编译准备 三. 例程实现 四. 小结 前言 语音识别相关算法一般在MATL ...

  8. 基于MATLAB的语音信号处理系统的设计

    目 录 摘 要 I Abstract II 1 绪论 1 2 语音信号处理系统设计方案 2 2.1MATLAB的说明 2 2.2系统框架及实现流程图 2 2.2.1系统框架: 2 2.2.2系统流程图 ...

  9. QQ语音消息转换成WAV格式

    原创文|Space9 问题背景 QQ已经成为我们生活中的一部分,在QQ上留下了我们许多美好的回忆,一段动听的音乐,或是一句甜蜜的话语,都能触动我们的内心.腾讯使用的语音文件是经过特殊编码(Silk V ...

  10. 波束形成、回声消除、声源定位及端到端等语音信号处理算法

    现今信息技术飞速发展,语音技术源源不断地融入到各个领域,语音信号处理是人机接口的关键技术,已广泛应用于直播.在线通话.智能音箱等产品中. (落地应用) 随着语音产品广泛落地应用,语音行业飞速发展,各大 ...

最新文章

  1. ASP .NET Core Web Razor Pages系列教程四:使用数据库进行交互(SqlServer 版)
  2. 10进制转换成16进制
  3. 0027-如何在CDH集群启用Kerberos
  4. Java自定义注解Annotation的实现原理
  5. python ctypes 回调函数_Python ctypes中具有自定义类型的回调
  6. Spring Boot是什么
  7. html任务3 模拟滚动条,vue3系列:vue3.0自定义虚拟滚动条V3Scroll|vue3模拟滚动条组件...
  8. 【Python3】Tensorflow_Fasterrcnn训练自己数据集,Keras_Yolov3_GPU训练自己数据集
  9. 多态和类属性、类方法
  10. Tensorflow——Dropout(解决过拟合问题)
  11. 易筋SpringBoot 2.1 | 第十篇:SpringBoot使用thymeleaf入门
  12. Spring Boot接支付宝第三方支付(沙箱)
  13. 基于单片机的超市储物柜设计_基于51单片机的超市自动储物柜的设计,求大佬指点?...
  14. android自定义六边形,Android实现六边形图像
  15. 17 RFID卡的读写
  16. 中国历代大大小小的皇帝(2)
  17. ArcGIS 矢量数据的空间校正和橡皮页变换
  18. 一百年沧桑巨变,数学大树依然长青
  19. windows 11 访问带SMB的文件服务器(小米路由器)
  20. php顺丰bsp订单跟踪,顺丰BSP接口PHP开发注意事项

热门文章

  1. 安卓应用出海指南--发布到Google Play
  2. Pywifi用法 - python
  3. 【maven】maven-scm-plugin 使用
  4. 批量获取中国所有行政区域经边界纬度坐标(到县区级别)
  5. Turbo码,接近完美的编码
  6. php编辑日历,【PHP】制作日历
  7. 2021年山东大学考研数字电路906真题
  8. 2022年10 款最佳计算机视觉开源数据标注工具
  9. [水晶报表]水晶报表创建以及调用方法
  10. 为什么程序员下班后只关显示器却从不关电脑?