没有合适的资源?快使用搜索试试~ 我知道了~
基于声纹识别的Windows Hello应用软件源代码1
需积分: 0 0 下载量 120 浏览量
2022-08-08
21:05:35
上传
评论
收藏 41KB DOCX 举报
温馨提示
试读
60页
//保存去掉空白处的语音文件,参数1为段落的个数,参数2为各个语音段落的开始点与结束点信息};//每次将tempNum做为高字节数据,新字节为低字节数据制作新数
资源推荐
资源详情
资源评论
#pragma once
#include <vector>
#include <iostream>
#include <windows.h>
using namespace std;
struct VoiceParagraph
{
unsigned long begin; //语
音段落开始点
unsigned long end; //语
音段落结束点
unsigned long voiceLength; //语音
段落长度
VoiceParagraph(unsigned long be, unsigned long en, unsigned long vo) { //构造初始化
begin = be;
end = en;
voiceLength = vo;
}
};
class WavFile
{
private:
FILE *fp; //文
件指针
char *fileName; //文
件名或地址
char id_RIFF[5]; //RIFF
块标志
unsigned long fileSize; //文件
的总字节数
char id_WAVE[5];
//WAV 标志
char id_FMT[5]; //格
式块标志
unsigned long formatLength; //格式
块长度,16 为正常,18 说明有附加信息
short formatTag; //格
式类别,值=1 表示编码方式为 PCMu 律编码
short channelsNumber; //声
道数
unsigned long sampleRate; //每
秒的样本数
unsigned long secondBytes; //每秒
数据的字节数
short chunkAlign; //采
样字节数
short sampleBits; //采
样位数
short appendInformation; //附
加信息,通过 formatLength 来判断
char id_FACT[5]; //附
加块标志
unsigned long appendLength; //附
加块长度
unsigned long appendNone; //未
知
char id_DATA[5]; //附
加块标志
unsigned long dataSize; //数据
部分字节数
char *data; //数
据部分
long *dataTuple; //每
个样本的数据
unsigned long dataNumber; //样
本的数据个数
long dataMax; //样
本数据的最大值
long dataMin; //样
本数据的最小值
bool Conversion_Tuple(void); //将直
接读取的数据转换为样本数据
long MakeWord(long NumberA, long NumberB); //合
并字节
public:
WavFile(void) {
dataMax = 0;
dataMin = 1000000;
}
WavFile(FILE *f) {
fp = f;
::WavFile();
}
~WavFile() {}
void Give_FP(FILE *f) {
fp = f;
}
bool Read_File(void); //读取
文件
unsigned long Get_SampleRate(void); //获取
采样频率
short Get_ChunkAlign(void); //获取
样本字节数
long Get_Data(unsigned long Number); //获取
某个位置上的数据
unsigned long Get_dataNumber(void); //获取
样本数据个数
void ShowData(void); //输
出数据
void SaveNewWav(unsigned long voiceNumber, vector<VoiceParagraph> voiceParagraph);
//保存去掉空白处的语音文件,参数 1 为段落的个数,参数 2 为各个语音段落的开始点与结
束点信息
};
#include "../stdafx.h"
#include "WavFile_Struct.h"
bool WavFile::Conversion_Tuple(void)
{
try
{
cout << "TIP : Change to real format data ..." << endl;
dataNumber = dataSize / chunkAlign; //求出
数据个数
dataTuple = (long*)malloc(sizeof(long)*dataNumber); //为新字节
数据空间赋值
long tempNum = 0; //用
来保存每个新字节数据
for (unsigned long i = 0; i < dataNumber; ++i) { //总共有
dataNumber 个数据
int Flag = 0;
for (short j = 0; j < chunkAlign; ++j) { //每个数据有两
个字节
tempNum = MakeWord((long)data[i*chunkAlign + j], tempNum); // 每次
将 tempNum 做为高字节数据,新字节为低字节数据制作新数据
}
dataTuple[i] = tempNum; //保
存下新字节数据
tempNum = 0; //
初始化缓冲区操作
if (dataMax < dataTuple[i]) { //求出最
大值
dataMax = dataTuple[i];
}
if (dataMin > dataTuple[i]) { //求出最
小值
dataMin = dataTuple[i];
}
}
}
catch (invalid_argument &e) {
cerr << e.what() << endl;
MessageBoxA(NULL, e.what(), "ERROR", MB_ICONHAND);
return false;
}
return true;
}
long WavFile::MakeWord(long NumberA, long NumberB) //合并
字节,NumberA 表示高字节位,NumberB 表示低字节位
{
int Flag = 0; //标志,
用来表示最后的数的正负,1 为负,0 为正
if (NumberA >= 0) {
if (NumberB >= 0) {
return NumberA * 256 + NumberB; //高
低字节都是正数,则直接移位合并
}
else {
return NumberA * 256 + abs(NumberB) + 128; //高字
节为正数,低字节为负数
}
}
else {
Flag = 1;
if (NumberB > 0) { //高字
节为负数,低字节为正数
return -1 * (abs(NumberA) * 256 + NumberB);
}
else { //高
低字节都是负数
return -1 * (abs(NumberA) * 256 + abs(NumberB) + 128);
}
}
}
bool WavFile::Read_File(void)
{
try
{
cout << "TIP : Reading file ..." << endl;
fread(id_RIFF, sizeof(char), 4, fp); //读取'RIFF'
id_RIFF[4] = 0; //末尾
添零
if (strcmp(id_RIFF, "RIFF")) {
throw invalid_argument("ERROR : File not RIFF file !");
}
fread(&fileSize, sizeof(unsigned long), 1, fp); //读取文件的大
小
fread(id_WAVE, sizeof(char), 4, fp); //读取
'WAVE'
id_WAVE[4] = 0;
if (strcmp(id_WAVE, "WAVE")) {
throw invalid_argument("ERROR : File not WAVE file !");
}
fread(id_FMT, sizeof(char), 4, fp); //读取'FMT'
id_FMT[3] = 32;
id_FMT[4] = 0;
fread(&formatLength, sizeof(unsigned long), 1, fp); //
fread(&formatTag, sizeof(short), 1, fp); //读取文件
标签
fread(&channelsNumber, sizeof(short), 1, fp); //读取通道
数目
fread(&sampleRate, sizeof(unsigned long), 1, fp); //读取采样频
率
fread(&secondBytes, sizeof(unsigned long), 1, fp); //读取每秒数
据量
fread(&chunkAlign, sizeof(short), 1, fp); //读取块对
其
fread(&sampleBits, sizeof(short), 1, fp); //读取样本
大小
剩余59页未读,继续阅读
资源评论
设计师马丁
- 粉丝: 18
- 资源: 299
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功