使用php实现的wav文件的相似度对比

此为通过对比两个文件前1秒内的声音数据来对比两个声音文件的相识性,来借此识别人们说话的内容.详细的识别方法是,首先先采集汉字的所有音素内容,包括声母和韵母,人后通过将声音文件分段,以最适合识别出单一音素内容为准,大概0.1秒左右的时长数据(以每秒22052个采样数据算的话就是每次处理2200个采样数据),每次都和所有音素对比相似度,采用最高的音素.以此循环处理完所有声音数据为一串特定字符数据(音素数据),每个音素的声音数据事先已保存为一组数值串(通过每个采样的数据转换而来的代替值-32768~32767之间).获得了音素数据之后开始转换为读音(声母+韵母的读音组合在400多个),因为采集的间隔短,所以会出现以下类似的串,如百度的声音可能会获取到EBBBXXXEEXXAAAEEEEEXDDDEEUUUXXXXXX(X为无意义串),获得有意义的BAEDEU(汉字基本都是声母+韵母格式,应该能比较容易得到对应汉字的读音的),得到了读音之后基本工作就完成了差不多了.接下来就是处理多音字问题了,这个可以通过字词间,句子前后间的内容判断出来..

===========以下内容为输出测试===========

原始文件大小:44162 byte

对比文件大小:44162 byte

文件类型:RIFF

文件大小:44154

WAVE文件格式:WAVE

fmt 波形格式标志:fmt

16 or 18PMC :18

编码方式 1为线性 大于1为压缩:1

声道数 1为单 2为双:1

采样频率:22050

byte率/每秒采样字节数:44100

块对齐/数据对齐单位,每个采样样本需要的字节数:2

每个采样需要比特数 占2字节:16

附加信息:0

fact:fact

数值 4:4

data:22052

data:data

音频数据大小:44104

相识度等于:69.059364896675 %

===========以下内容为php源码===========


$a=array();

$awj="c:\\1.wav";//$_POST["name"];//数据文件-------------------------------------

$bwj="c:\\w.wav";//$_POST["age"];//待对比文件-------------------------------------

$sh=fopen($awj,"rb");//-----------------

$head=fread($sh,filesize($awj));//      |打开数据文件

fclose($sh);         //-----------------

$zh=fopen($bwj,"rb");//-----------------

$zead=fread($zh,filesize($bwj));//      |打开待对比文件文件

fclose($zh);         //-----------------

$wjdx=44158;//filesize($awj);//用来比较的数量,以数据文件为准-------------------------------------

$arr=unpack("C$wjdx",$head);

$zrr=unpack("C$wjdx",$zead);

echo "
";

echo "原始文件大小:".filesize($awj)." byte";

echo "
";

echo "对比文件大小:".filesize($bwj)." byte";

//-----------------------------------------------------------------开始获取WAV数据-------------------

echo "
文件类型:".chr($arr[1]).chr($arr[2]).chr($arr[3]).chr($arr[4]);

echo "
文件大小:";

echo $arr[8]*16777216+$arr[7]*65536+$arr[6]*256+$arr[5];

echo "
WAVE文件格式:";

echo chr($arr[9]).chr($arr[10]).chr($arr[11]).chr($arr[12]);

echo "
fmt 波形格式标志:";

echo chr($arr[13]).chr($arr[14]).chr($arr[15]).chr($arr[16]);

echo "
16 or 18PMC :";

echo $arr[20]*16777215+$arr[19]*65536+$arr[18]*256+$arr[17];

echo "
编码方式 1为线性 大于1为压缩:";

echo $arr[22]*256+$arr[21];

echo "
声道数 1为单 2为双:";

echo $arr[24]*256+$arr[23];

echo "
采样频率:";

echo $arr[28]*16777215+$arr[27]*65536+$arr[26]*256+$arr[25];

echo "
byte率/每秒采样字节数:";

echo $arr[32]*16777215+$arr[31]*65536+$arr[30]*256+$arr[29];

echo "
块对齐/数据对齐单位,每个采样样本需要的字节数:";

echo $arr[34]*256+$arr[33];

echo "
每个采样需要比特数 占2字节:";

echo $arr[36]*256+$arr[35];

if($arr[20]*16777215+$arr[19]*65536+$arr[18]*256+$arr[17]==16)

{

echo "
fact:";

echo chr($arr[37]).chr($arr[38]).chr($arr[39]).chr($arr[40]);

echo "
数值 4:";

echo $arr[44]*16777215+$arr[43]*65536+$arr[42]*256+$arr[41];

echo "
data:";

echo $arr[48]*16777215+$arr[47]*65536+$arr[46]*256+$arr[45];

echo "
data:";

echo chr($arr[49]).chr($arr[50]).chr($arr[51]).chr($arr[52]);

echo "
音频数据大小:";

echo $arr[56]*16777215+$arr[55]*65536+$arr[54]*256+$arr[53];

}

else

{

echo "
附加信息:";

echo $arr[38]*256+$arr[37];

echo "
fact:";

echo chr($arr[39]).chr($arr[40]).chr($arr[41]).chr($arr[42]);

echo "
数值 4:";

echo $arr[46]*16777215+$arr[45]*65536+$arr[44]*256+$arr[43];

echo "
data:";

echo $arr[50]*16777215+$arr[49]*65536+$arr[48]*256+$arr[47];

echo "
data:";

echo chr($arr[51]).chr($arr[52]).chr($arr[53]).chr($arr[54]);

echo "
音频数据大小:";

echo $arr[58]*16777215+$arr[57]*65536+$arr[56]*256+$arr[55];

}

echo "
";

//print_r($arr);//此为数据数组的遍历显示

echo "
";

//print_r($zrr);//此为待比较数组的遍历显示

reset($arr);

while (list($key, $val) = each($arr))

{

if ($arr[$key]==0 and $zrr[$key]==0)

$a[]=1;

else if(($arr[$key]*$zrr[$key])==0)

$a[]=0;

else

{

if($arr[$key]>$zrr[$key])

$a[]=$zrr[$key]/$arr[$key];

else

$a[]=$arr[$key]/$zrr[$key];

}

}

echo "
相识度等于:".((array_sum($a)/$wjdx)*100)." %
";//计算所有数组的和,再除以数值的个数,得到两个数组的相识度

//print_r($a);//此为遍历显示各个数值的相似度,两数值中有一个数值为0则相识度为0.

//====================下面来说将WAV获得的数据做-2.5v到+2.5v的量化,从第59字节开始,每个采样占2字节

$wav=array();

$wavint=1;

$bianliang=59;//从这里开始

while($bianliang

{

$wav[$wavint]=($arr[$bianliang+1]*256+$arr[$bianliang])-32768;

$bianliang=$bianliang+2;

$wavint=$wavint+1;

}

//print_r($wav);//从这里结束

?>

完成,这个是自己边学php边实践的小玩意儿= =

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • $awj="c:\\Users\\linker\\Pictures\\1.bmp";//需要读取的文件 $sh=f...
    f675b1a02698阅读 3,764评论 0 0
  • 一、php可以做什么 php是一种可以在服务器端运行的编程语言,可以运行在Web服务器端。 php是一门后台编程语...
    空谷悠阅读 8,317评论 4 97
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,546评论 19 139
  • 1、memcache的概念? Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨...
    桖辶殇阅读 6,693评论 2 12
  • 1.创建文件夹 !/bin/sh mkdir -m 777 "%%1" 2.创建文件 !/bin/sh touch...
    BigJeffWang阅读 13,464评论 3 53