此為通過對比兩個文件前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邊實踐的小玩意兒= =