pocketsphinx語音識別系統的程式設計
關於語音識別的基礎知識和sphinx的知識,具體可以參考我的另外的博文:
語音識別的基礎知識與cmusphinx介紹:
/article/details/7941585
pocketsphinx語音識別系統的編譯、安裝和使用:
/article/details/7942784
pocketsphinx語音識別系統語言模型的訓練和聲學模型的改進:
/article/details/7949126
pocketsphinx語音識別系統聲學模型的訓練與使用
/article/details/7962382
本文主要實現pocketsphinx語音識別系統的程式設計使用,主要分兩個方面,乙個是程式設計解碼語音檔案(主要參考cmu sphinx的wiki:
),二是程式設計識別麥克風的語音(主要參考pocketsphinx原始碼包裡的pocketsphinx.c檔案)。對於後面加入我的人機互動系統的話,採用的是識別麥克風的語音的程式設計,具體使用時還需要對其進行精簡。
一、程式設計解碼語音檔案
1、程式設計:
#include int main(int argc, char *argv)
//4、使用ps_decode_raw()進行解碼
rv = ps_decode_raw(ps, fh, null, -1);
if (rv < 0)
return 1;
//5、得到解碼的結果(概率最大的字串) hypothesis
hyp = ps_get_hyp(ps, &score, &uttid);
if (hyp == null)
return 1;
printf("recognized: %s\n", hyp);
//從記憶體中解碼音訊資料
//現在我們將再次解碼相同的檔案,但是使用api從記憶體塊中解碼音訊資料。在這種情況下,首先我們
//需要使用ps_start_utt()開始說話:
fseek(fh, 0, seek_set);
rv = ps_start_utt(ps, null);
if (rv < 0)
return 1;
while (!feof(fh))
//我們需要使用ps_end_utt()去標記說話的結尾處:
rv = ps_end_utt(ps);
if (rv < 0)
return 1;
//以相同精確的方式執行來檢索假設的字串:
hyp = ps_get_hyp(ps, &score, &uttid);
if (hyp == null)
return 1;
printf("recognized: %s\n", hyp);
} //6、清理工作:使用ps_free()釋放使用ps_init()返回的物件,不用釋放配置物件。
fclose(fh);
ps_free(ps);
return 0;
}
2、編譯:
編譯方法:
gcc -o test_ps test_ps.c \
-dmodeldir=\"`pkg-config --variable=modeldir pocketsphinx`\" \
`pkg-config --cflags --libs pocketsphinx sphinxbase`
//gcc的-d選項,指定巨集定義,如-dmacro=defn 相當於c語言中的#define macro=defn那麼上面就表示在test_ps.c檔案中,新加入乙個巨集定義:
#define modeldir=\"`pkg-config --variable=modeldir pocketsphinx`\"
\表示轉義符,把「號轉義。
這麼做是為什麼呢?因為程式中需要指定modeldir這個變數,但是因為不同的使用者,這個變數不一樣,沒辦法指定死乙個路徑,所以只能放在編譯時,讓使用者去根據自己的情況來指定。
pkg-config工具可以獲得乙個庫的編譯和連線等資訊;
#pkg-config --cflags --libs pocketsphinx sphinxbase
顯示:-i/usr/local/include/sphinxbase -i/usr/local/include/pocketsphinx
-l/usr/local/lib -lpocketsphinx -lsphinxbase –lsphinxad
#pkg-config --variable=modeldir pocketsphinx
顯示結果輸出:/usr/local/share/pocketsphinx/model
二、程式設計解碼麥克風的錄音
1、程式設計
麥克風錄音資料的獲得主要是用sphinxbase封裝了alsa的介面來實現。
#include #include #include #include #include #include #include //generic live audio inte***ce for recording and playback
#include #include #include "pocketsphinx.h"
static ps_decoder_t *ps;
static cmd_ln_t *config;
static void print_word_times(int32 start)
}/* sleep for specified msec */
static void sleep_msec(int32 ms)
/* * main utterance processing loop:
* for (;;)
*/static void recognize_from_microphone()
else
/** decode whatever data was read above.
*/rem = ps_process_raw(ps, adbuf, k, false, false);
/* if no work to be done, sleep a bit */
if ((rem == 0) && (k == 0))
sleep_msec(20);}/*
* utterance ended; flush any accumulated, unprocessed a/d data and stop
* listening until current utterance completely decoded
*/ad_stop_rec(ad);
while (ad_read(ad, adbuf, 4096) >= 0);
cont_ad_reset(cont);
printf("stopped listening, please wait...\n");
fflush(stdout);
/* finish decoding, obtain and print result */
ps_end_utt(ps);
hyp = ps_get_hyp(ps, null, &uttid);
printf("%s: %s\n", uttid, hyp);
fflush(stdout);
/* exit if the first word spoken was goodbye */
if (hyp)
/* resume a/d recording for next utterance */
if (ad_start_rec(ad) < 0)
e_fatal("failed to start recording\n");
}cont_ad_close(cont);
ad_close(ad);
}static jmp_buf jbuf;
static void sighandler(int signo)
int main(int argc, char *argv)
2、編譯
和1.2一樣。
至於說後面把
pocketsphinx
語音識別系統加入我的人機互動系統這個階段,因為感覺這個系統本身的識別率不是很高,自己做了適應和重新訓練聲學和語言模型後,提公升還是有限,暫時實用性還不是很強,所以暫時擱置下,看能不能通過其他方法去改進目前的狀態。希望有牛人指導下。另外,由於開學了,需要上課,所以後續的程序可能會稍微減慢,不過依然期待各位多多交流!呵呵
微信公眾平台訊息介面開發(10)語音觸發 非識別
一 通過輸入文字的方式查詢天氣 一般都是通過城市名稱 拼音 區號等方式實現的查詢,基本上都是搜尋資料庫,獲得對應的查詢介面,然後傳送查詢天氣,將結果封裝成天氣格式發給使用者。比如下面就分別是通過名稱,拼音 區號,郵編方式執行的天氣查詢 二 通過不輸入文字的方式查詢天氣 1.化繁為簡 就查詢方式來說,...
微信公眾平台訊息介面開發(10)語音觸發 非識別
本系統教程以微信公眾平台應用天氣神 賬號weathergod,支援國內近400個城市天氣的名稱 拼音 區號 郵編以及語音觸發模式查詢 為例,講解微信介面開發過程。歡迎大家關注該賬號並使用語音方式查詢當地天氣,見底部。一 通過輸入文字的方式查詢天氣 一般都是通過城市名稱 拼音 區號等方式實現的查詢,基...
C 語音識別(文字to語音 語音to文字)
最近打算研究一下語音識別,但是發現網上很少有c 的完整 就把自己的學習心得放上來,和大家分享一下。1 speechsdk51.exe 67.0 mb 2 speechsdk51langpack.exe 81.0 mb 文字to語音 這個相當的簡單。1 在com選項卡裡面的microsoft spee...