VS语音信号处理(4) C语言WAV格式语音存为PCM格式语音工程实例

  • 前言
  • 一. 工程实现
  • 二. 生成编译
  • 三. 小结

前言

语音识别相关算法一般在MATLAB上进行仿真验证与实验,在工程上一般还是在VS中进行实现落地,本系列将介绍语音信号处理在C语言中的一系列应用,后期将以此为基础,再落地移植到嵌入式平台。

今天介绍WAV格式语音存为PCM格式语音的工程应用。两种格式语音的唯一区别在于WAV语音包含文件头信息,而PCM格式语音仅包含语音数据流。语音格式转换也算是一种比较常见的应用,可以让我们更好的理解语音文件的格式信息。

一. 工程实现

打开VS2015

点击新建一个项目(工程),输入项目名:Wav2pcm

点击“确定”,创建项目

左侧解决方案资源管理器视图中,源文件栏右键添加新建项,

点击C++文件,新建一个源文件Wav2pcm.cpp,点击“添加”

输入代码如下:

// Wav2pcm.cpp
// wav格式语音文件转存为pcm格式语音
// 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 = "test.wav";uint32_t pcm_data_size = 0;int pcm_channel = 0;int pcm_samplerate = 0;//以下是为了建立.wav头而准备的变量    wav_head header;FILE   *fp = NULL, *fpCpy = NULL;int flen;if ((fp = fopen(src_file, "rb")) == NULL) //读取文件    {printf("open wav file %s error\n", argv[1]);return -1;}if ((flen = fread(&header.riff.riff, 1, 4, fp)) != 4)goto error;if (memcmp(&header.riff.riff, "RIFF", 4))goto error;if ((flen = fread(&header.riff.len, 1, 4, fp)) != 4)goto error;if ((flen = fread(&header.riff.wave, 1, 4, fp)) != 4)goto error;if (memcmp(&header.riff.wave, "WAVE", 4))goto error;if ((flen = fread(&header.format.fmt, 1, 4, fp)) != 4)goto error;if (memcmp(&header.format.fmt, "fmt ", 4))goto error;if ((flen = fread(&header.format.len, 1, 4, fp)) != 4){goto error;}if (header.format.len != 0x10){printf("header.format.len!=0x10 :value:%d\n", header.format.len);}if ((flen = fread(&header.format.type, 1, 2, fp)) != 2){goto error;}if (header.format.type != 0x1){printf("header.format.type != 0x1 :value:%d\n", header.format.type);}if ((flen = fread(&header.format.channel, 1, 2, fp)) != 2){goto error;}pcm_channel = header.format.channel;if ((flen = fread(&header.format.rate, 1, 4, fp)) != 4){goto error;}pcm_samplerate = header.format.rate;if ((flen = fread(&header.format.bps, 1, 4, fp)) != 4){goto error;}if ((flen = fread(&header.format.blockalign, 1, 2, fp)) != 2){goto error;}if ((flen = fread(&header.format.bitpspl, 1, 2, fp)) != 2){goto error;}int p = 0;//后面的结构可能不是直接为“data”do {if ((flen = fread(&header.data.data, 1, 4, fp)) != 4){goto error;}if (memcmp(&header.data.data, "data", 4) == 0){printf("find data chunk.");if ((flen = fread(&header.data.len, 1, 4, fp)) != 4){goto error;}pcm_data_size = header.data.len;break;}elsep += 4;} while (!feof(fp));printf("解析成功,二段PCM数据长度分别为:%d, %d\n", pcm_data_size, header.riff.len - 36);int otherdataSize = header.riff.len - 36 - pcm_data_size;if (otherdataSize>0){printf("多余的数据部分大小:%d , %d", p, otherdataSize);char *otherdata = (char *)malloc(otherdataSize + 1);memset(otherdata, 0, otherdataSize + 1);fseek(fp, -otherdataSize - 8, SEEK_CUR);fread(otherdata, 1, otherdataSize, fp);*(otherdata + otherdataSize) = '\0';fseek(fp, 8, SEEK_CUR);printf("   other data:%s", otherdata);}fseek(fp, otherdataSize + 44, SEEK_SET);//fseek(fp, 0, SEEK_CUR);unsigned char *buffer = (unsigned char*)malloc((pcm_data_size) * sizeof(char));memset(buffer, 0, pcm_data_size);int count1 = fread(buffer, 1, pcm_data_size, fp);char output[1024] = { 0 };sprintf(output, "%d_%d_.pcm", pcm_samplerate, pcm_channel);if ((fpCpy = fopen(output, "wb+"))){//fwrite(buffer, 1, sizeof(buffer), fpCpy);  写了段常犯错的代码fwrite(buffer, 1, pcm_data_size, fpCpy);}elsegoto error;free(buffer);fclose(fp); //关闭文件    fclose(fpCpy);   //关闭文件    return 0;error:if (fp){fclose(fp);}if (fpCpy){fclose(fpCpy);}return -1;
}

二. 生成编译

点击目录栏“生成”中“生成解决方案”

生成成功!找一个WAV格式语音,命名为test.wav,放在Wav2pcm.cpp同目录下,点击调试运行,生成一个48000_2_.pcm文件,调用成功。

三. 小结

最近项目上需要对语音信号进行处理,这个是对语音格式进行转换的工程,可以正常跑通,相对也比较简单,值得注意的是,如果没有将test.wav导入的话,工程不会报警提示,所以有需要的同学在应用的时候需要注意一下,没有源语音是得不到pcm语音的。

VS语音信号处理(4) C语言WAV格式语音存为PCM格式语音工程实例相关推荐

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

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

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

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

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

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

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

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

  5. 语音信号处理-1-----语音信号预处理

    From:BUPT某非著名小白研究生,因研究语音信息处理,因基础知识薄弱,又不甘颓废当个咸鱼,写一些赵力<语音信号处理>此书的一些理解.写博客以鞭策自己前进.(实在觉得书本上好多废话,就在 ...

  6. 随笔(十) mp3格式转pcm格式并调用百度语音识别

    前言: 近期做帮做毕业设计,需求里面要做语音识别,识别出用户朗读的文章,将识别出来的字符串返回给用户查看.这个想到的就只有百度开放平台的api了. 思路: ① 前往百度开放平台拿到APP_ID,API ...

  7. 语音信号处理 c语言,语音信号处理(毕业设计论文).doc

    语音信号处理(毕业设计论文) 摘 要 语音信号处理是研究用数字信号处理技术和语音学知识对语音信号进行处理的新兴的学科,是目前发展最为迅速的信息科学研究领域的核心技术之一.通过语音传递信息是人类最重要. ...

  8. C语言wav格式详解,代码实践

    **[注意:此文章为笔者加强自己所学知识所写,如有疏漏请多多包涵,当然如果能帮助到其他人就更好了] 上篇提到了wav文件格式,但是只是简单了解,目的是读取wav数据写入pcm. 本篇重点详细介绍wav ...

  9. 语音信号处理复习:WAV文件格式

    音频简介 WAV即WAVE,是经典的Windows音频数 据封装格式,由Microsoft开发. 44100HZ 16bit stereo  22050HZ 8bit mono 采样率:声音信号在& ...

  10. 数字信号处理--语音信号处理

    摘 要 语音信号处理是研究用数字信号处理技术对语音信号进行处理的一门学科.语音信号处理的目的是得到某些参数以便高效传输或存储,或者是用于某种应用.本设计利用计算机Windows下的录音机录入一句语音信 ...

最新文章

  1. 【HDU/算法】最短路问题 杭电OJ 2544 (Dijkstra,Dijkstra+priority_queue,Floyd,Bellman_ford,SPFA)
  2. 机器学习的数据类型有哪几种?每种数据类型对应的操作有哪些?为什么?
  3. Android内存管理-OnTrimMemory
  4. windows php swoole 安装
  5. python字符串与列表的相互转换
  6. 计算机硬件市场调查实验报告,计算机组装与维护实训报告范例.doc
  7. linux mkdir 参数,Linux基础命令之 mkdir
  8. ICANN总裁Fadi Chehadé:IPv6峰会全面推动了IPv6在中国的发展与产业落地
  9. CRI 与 ShimV2:一种 Kubernetes 集成容器运行时的新思路
  10. GJB150-2009军用装备实验室环境试验方法新版标准
  11. 创维E900V21E机顶盒刷机固件 解决:不用设置有线自动连网
  12. C# html日期选择控件,C#实现日期选择
  13. excel Cell函数
  14. 基因结构图的0_在线网站绘制基因结构图!
  15. FFFfrance博客介绍
  16. 需求预测——Gallat: A Spatiotemporal Graph Attention Network for Passenger Demand Prediction
  17. 《金融学》笔记 第五章 金融市场
  18. 使用AnyGantt创建Word Tree
  19. Zabbix官方文档以及日常运维
  20. Word文档中styles分析

热门文章

  1. 枪毙ctfmon.exe 恢复你的默认输入法
  2. TraceView 的使用
  3. Android证书签名生成
  4. 家庭监控方案设计及施工-无线监控
  5. 隧道监控计算机网络系统方案,高速公路隧道监控系统解决方案
  6. c语言如何用气泡法编程最大 最小值,[c语言冒泡排序法]C语言冒泡排序法详解
  7. 火狐浏览器安装插件“组件未验证无法安装”问题解决
  8. 基于python的opc读写和导入MSSQL/MYSQL的KepOPC中间件
  9. 设置win10保护色
  10. 在consul中删除服务