使用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边实践的小玩意儿= =

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

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