VS语音信号处理(2) C语言分段读取WAV语音文件语音数据
前言
语音识别相关算法一般在MATLAB上进行仿真验证与实验,在工程上一般还是在VS中进行实现落地,本系列将介绍语音信号处理在C语言中的一系列应用,后期将以此为基础,再落地移植到嵌入式平台。
语音文件的格式多种多样都存在不同的标准,在WAV格式的语音文件中主要包含两个部分:文件头与语音数据,本文将介绍读取WAV语音文件的文件头数据。WAV格式语音文件数据标准如下图所示。
即前44位位文件头数据,44位之后为语音数据。下面进行分段读取语音数据,注意,本实例分段读取语音数据时需单步调试查看buffer中数据,如需对语音数据进行处理即在分段读取时进行处理。
一. 工程实现
#include <stdio.h>
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
const char *input_file_name = "456.wav";
const int buf_size = 640;
static char buffer[buf_size];
void read()
{
FILE* pFILE = fopen(input_file_name, "rb");
fseek(pFILE, 44, SEEK_SET);
string str = "";
while (!feof(pFILE))
{
int size = fread(buffer, 1, buf_size, pFILE);
char* buf = buffer;
const char* buf_end = buf + size;
while (buf < buf_end)
{
if (*buf == '\n')
{
printf("%s\n", str.c_str());
str = "";
++buf;
continue;
}
str += *buf, ++buf;
}
}
fclose(pFILE);
return;
}
int main() {
read();
return 0;
}
二. 结果
因为编码格式的问题,显示的数据时乱码的,也因为读取数据时是以char型进行保存的,所以呈现出上图式样。
三. 小结
最近项目上需要对WAV语音进行处理,网上找了许多资料去读取语音数据都是采集不到,读出来的数据总是空的,这个例程通过分段读取很好的将语音数据还原了出来,一次性读取好像都不太理想(数据读不出来),后期找到不用分段读取语音数据的方法时,再进行详细介绍。
|