使用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閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容

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