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