一个语音的测试

2017.12.13

      一个关于语音的小作业。

      由于工作的原因,开始接触大量关于语音方面的东西,一个主要的感觉就是见识增长了。下面总结一下一次完成的小作业。 

       wav和pcm文件是最常见的两种音频文件,让我们了解一下它们的区别。

       WAV:是一种无损的音频文件格式,符合PIFF规范。所有的wav都有一个文件头,这个文件头音频流的编码参数。

       PCM:脉冲调制录音。即将声音等模拟信号变成符号化的脉冲列,再予以记录。PCM信号是由[1]、[0]等符号构成的数字信号,而未经过任何编码和压缩处理。

       WAV和PCM的关系

       pcm是无损wav文件中音频数据的一种编码方式,但wav 还可以使用其它方式编码。

       wav音频文件的格式:

       wav文件由文件头和采样数据2部分组成。

文件头又分为RIFF、WAVE文件标识段和声音格式说明段组成,各段的起始地址分别由RIFF标识符、以及波形格式标识符(FMT)标定。

       

        这幅图是WAV前 44个字节的意思。一般在进行语音方面的计算时会去掉这44个字节。还想知道更多的话点击链接:http://soundfile.sapp.org/doc/WaveFormat/

        下面是本次的小练习:

         1.给一个wav文件,能读取该音频的采样率,采样精度,声道数等信息。

        2.在1的基础上对语音文件的大小进行计算,并对音频播放的时间也进行计算。

        

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

struct WAV_Format { //定义一个结构体WAV文件
	uint32_t ChunkID;	/* "RIFF" 资源交换文件标志*/
	uint32_t ChunkSize;	/* 从下个地址开始到文件尾的总字节数*/
	uint32_t Format;	/* "WAVE文件标志" */

	/* sub-chunk "fmt" */
	uint32_t Subchunk1ID;	/* "fmt " */
	uint32_t Subchunk1Size;	/* 16 for PCM */
	uint16_t AudioFormat;	/* PCM = 1*/
	uint16_t NumChannels;	/* Mono = 1, Stereo = 2, by tc 通道数,单通道为1,双通道为2 */
	uint32_t SampleRate;	/* 8000, 44100, by tc 采样频率 */
	uint32_t ByteRate;	/* = SampleRate * NumChannels * BitsPerSample/8  波形数据传输速率*/
	uint16_t BlockAlign;	/* = NumChannels * BitsPerSample/8 */	
	uint16_t BitsPerSample;	/* 8bits, 16bits, by tc */

	/* sub-chunk "data" */
	uint32_t Subchunk2ID;	/* "data" */
	uint32_t Subchunk2Size;	/* data size */

	uint32_t FileSize;
	uint32_t Time;//播放时间
}; 

int main(void)
{
	FILE *fp = NULL;
	struct WAV_Format wav;

	fp = fopen("C:\\Users\\admin\\Desktop\\female.wav", "rb");
	if (!fp) {
		printf("can't open audio file\n");
		exit(1);
	}

	fread(&wav, 1, sizeof(struct WAV_Format), fp);

	printf("ChunkID \t%x\n", wav.ChunkID);
	printf("ChunkSize \t%d\n", wav.ChunkSize);//块大小
	printf("Format \t\t%x\n", wav.Format);
	printf("Subchunk1ID \t%x\n", wav.Subchunk1ID);
	printf("Subchunk1Size \t%d\n", wav.Subchunk1Size);
	printf("AudioFormat \t%d\n", wav.AudioFormat);
	printf("NumChannels \t%d\n", wav.NumChannels);
	printf("SampleRate \t%d\n", wav.SampleRate);
	printf("ByteRate \t%d\n", wav.ByteRate);
	printf("BlockAlign \t%d\n", wav.BlockAlign);
	printf("BitsPerSample \t%d\n", wav.BitsPerSample);
	printf("Subchunk2ID \t%x\n", wav.Subchunk2ID);
	printf("Subchunk2Size \t%d\n", wav.Subchunk2Size);

	wav.FileSize = (96000*wav.NumChannels*6)/8;
	printf("数据量是:\t%d B\n",wav.FileSize);
	wav.Time= wav.Subchunk2Size / wav.ByteRate;
	printf("音频播放的时间为:\t%d 秒\n",wav.Time);

	fclose(fp);

	return 0;
}

      结果如下:

       

 

        另外为什么文中使用uint32_t进行定义,主要可以有效的维护代码。

        可以参考博客:http://blog.csdn.net/kiddy19850221/article/details/6655066

        over,去健身房。

        
 
 
  
       
 

猜你喜欢

转载自3056434592.iteye.com/blog/2404622