使用php實現(xiàn)的wav文件的相似度對比

此為通過對比兩個文件前1秒內(nèi)的聲音數(shù)據(jù)來對比兩個聲音文件的相識性,來借此識別人們說話的內(nèi)容.詳細的識別方法是,首先先采集漢字的所有音素內(nèi)容,包括聲母和韻母,人后通過將聲音文件分段,以最適合識別出單一音素內(nèi)容為準(zhǔn),大概0.1秒左右的時長數(shù)據(jù)(以每秒22052個采樣數(shù)據(jù)算的話就是每次處理2200個采樣數(shù)據(jù)),每次都和所有音素對比相似度,采用最高的音素.以此循環(huán)處理完所有聲音數(shù)據(jù)為一串特定字符數(shù)據(jù)(音素數(shù)據(jù)),每個音素的聲音數(shù)據(jù)事先已保存為一組數(shù)值串(通過每個采樣的數(shù)據(jù)轉(zhuǎn)換而來的代替值-32768~32767之間).獲得了音素數(shù)據(jù)之后開始轉(zhuǎn)換為讀音(聲母+韻母的讀音組合在400多個),因為采集的間隔短,所以會出現(xiàn)以下類似的串,如百度的聲音可能會獲取到EBBBXXXEEXXAAAEEEEEXDDDEEUUUXXXXXX(X為無意義串),獲得有意義的BAEDEU(漢字基本都是聲母+韻母格式,應(yīng)該能比較容易得到對應(yīng)漢字的讀音的),得到了讀音之后基本工作就完成了差不多了.接下來就是處理多音字問題了,這個可以通過字詞間,句子前后間的內(nèi)容判斷出來..

===========以下內(nèi)容為輸出測試===========

原始文件大小:44162 byte

對比文件大小:44162 byte

文件類型:RIFF

文件大小:44154

WAVE文件格式:WAVE

fmt 波形格式標(biāo)志:fmt

16 or 18PMC :18

編碼方式 1為線性 大于1為壓縮:1

聲道數(shù) 1為單 2為雙:1

采樣頻率:22050

byte率/每秒采樣字節(jié)數(shù):44100

塊對齊/數(shù)據(jù)對齊單位,每個采樣樣本需要的字節(jié)數(shù):2

每個采樣需要比特數(shù) 占2字節(jié):16

附加信息:0

fact:fact

數(shù)值 4:4

data:22052

data:data

音頻數(shù)據(jù)大小:44104

相識度等于:69.059364896675 %

===========以下內(nèi)容為php源碼===========


$a=array();

$awj="c:\\1.wav";//$_POST["name"];//數(shù)據(jù)文件-------------------------------------

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

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

$head=fread($sh,filesize($awj));//? ?? ?|打開數(shù)據(jù)文件

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

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

$zead=fread($zh,filesize($bwj));//? ?? ?|打開待對比文件文件

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

$wjdx=44158;//filesize($awj);//用來比較的數(shù)量,以數(shù)據(jù)文件為準(zhǔn)-------------------------------------

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

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

echo "
";

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

echo "
";

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

//-----------------------------------------------------------------開始獲取WAV數(shù)據(jù)-------------------

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 波形格式標(biāo)志:";

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 "
聲道數(shù) 1為單 2為雙:";

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

echo "
采樣頻率:";

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

echo "
byte率/每秒采樣字節(jié)數(shù):";

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

echo "
塊對齊/數(shù)據(jù)對齊單位,每個采樣樣本需要的字節(jié)數(shù):";

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

echo "
每個采樣需要比特數(shù) 占2字節(jié):";

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 "
數(shù)值 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 "
音頻數(shù)據(jù)大小:";

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 "
數(shù)值 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 "
音頻數(shù)據(jù)大小:";

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

}

echo "
";

//print_r($arr);//此為數(shù)據(jù)數(shù)組的遍歷顯示

echo "
";

//print_r($zrr);//此為待比較數(shù)組的遍歷顯示

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)." %
";//計算所有數(shù)組的和,再除以數(shù)值的個數(shù),得到兩個數(shù)組的相識度

//print_r($a);//此為遍歷顯示各個數(shù)值的相似度,兩數(shù)值中有一個數(shù)值為0則相識度為0.

//====================下面來說將WAV獲得的數(shù)據(jù)做-2.5v到+2.5v的量化,從第59字節(jié)開始,每個采樣占2字節(jié)

$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);//從這里結(jié)束

?>

完成,這個是自己邊學(xué)php邊實踐的小玩意兒= =

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • $awj="c:\\Users\\linker\\Pictures\\1.bmp";//需要讀取的文件 $sh=f...
    f675b1a02698閱讀 668評論 0 0
  • 一、php可以做什么 php是一種可以在服務(wù)器端運行的編程語言,可以運行在Web服務(wù)器端。 php是一門后臺編程語...
    空谷悠閱讀 3,279評論 4 97
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • 1、memcache的概念? Memcache是一個高性能的分布式的內(nèi)存對象緩存系統(tǒng),通過在內(nèi)存里維護一個統(tǒng)一的巨...
    桖辶殤閱讀 2,360評論 2 12
  • 1.創(chuàng)建文件夾 !/bin/sh mkdir -m 777 "%%1" 2.創(chuàng)建文件 !/bin/sh touch...
    BigJeffWang閱讀 10,495評論 3 53

友情鏈接更多精彩內(nèi)容