pocketsphinx庫(離線語音識別)


語音是一個連續的音頻流,它是由大部分的穩定態和部分動態改變的狀態混合構成。

 

 

語音識別系統本質上屬於模式識別系統的范疇,都包含有特征提取和模板識別.

機器在識別匹配過程中,將輸入語音信號的特征與模板庫中的特征參數進行對比,根據所選建模方式,找出與之最為相近的模板參數,最終得到識別結果。優化的結果與特征的選擇、聲學模型的好壞、模板的准確性都有直接的關系。

Sphinx是由美國卡內基梅隆大學開發的大詞匯量、非特定人、連續英語語音識別系統。項目網址https://cmusphinx.github.io/

Sphinx家族全家福:

 

 

 

  • Acoustic and Language Models:語音和語料模型,支持多種語言.
  • Sphinxbase:核心庫
  • Sphinxtrain:生成用戶自己語音語料模型的工具
  • Pocketsphinx: PocketSphinx是一個計算量和體積都很小的嵌入式語音識別引擎。在Sphinx-2的基礎上針對嵌入式系統的需求修改、優化而來,是第一個開源面向嵌入式的中等詞匯量連續語音識別項目。識別精度和Sphinx-2差不多。
  • Sphinx-2: 采用半連續隱含馬爾可夫模型(SCHMM)建模,采用的技術相對落后,使得識別精度要低於其它的譯碼器。
  • Sphinx-3: CMU高水平的大詞匯量語音識別系統,采用連續隱含馬爾可夫模型CHMM建模。支持多種模式操作,高精度模式扁平譯碼器,由Sphinx3的最初版本優化而來;快速搜索模式樹譯碼器。目前將這兩種譯碼器融合在一起使用。
  • Sphinx-4: 是由Java語言編寫的大詞匯量語音識別系統,采用連續的隱含馬爾可夫模型建模,和以前的版本相比,它在模塊化、靈活性和算法方面做了改進,采用新的搜索策略,支持各種不同的語法和語言模型、聽覺模型和特征流,創新的算法允許多種信息源合並成一種更符合實際語義的優雅的知識規則。由於完全采用JAVA語言開發,具有高度的可移植性,允許多線程技術和高度靈活的多線程接口。

pocketSphinx-python是sphinx的python版本.在github頁面下(https://github.com/cmusphinx/pocketsphinx-python)

Pocketsphinx的安裝及基本使用

Pocketsphinx現在最新的版本是 5prealpha.下載安裝文件后,解壓.進入文件夾.,如果需要gstreamer支持,那么首先需要安裝gstreamer, 然后再安裝pocketsphinx.:https://cmusphinx.github.io/wiki/gstreamer/

Pocketsphinx-python安裝

https://pypi.org/project/pocketsphinx/

也可以安裝pocketsphinx的python支持版本.首先下載所有的文件,包括sphinxbase和pocketsphinx.在安裝時候需要首先安裝上sphinxbase, pocketsphinx, 然后在pocketSphinx-python路徑下輸入:

python setup.py install

Sphinx有兩種模式:

  • 一種是detect模式 
config.set_string('-hmm', os.path.join(MODELDIR, 'en-us/en-us')) # 計算模型
config.set_string('-lm', os.path.join(MODELDIR, 'en-us/en-us.lm.bin')) #語言模型
config.set_string('-dict', os.path.join(MODELDIR, 'en-us/cmudict-en-us.dict')) # 詞典模型
  • 一種是keyphrase模式.,以下是keyphrase模式的設置:
config.set_string('-keyphrase', 'forward')
config.set_float('-kws_threshold', 1e+20)

測試代碼

import os
from pocketsphinx import LiveSpeech, get_model_path

model_path = get_model_path()

speech = LiveSpeech(
    verbose=False,
    sampling_rate=16000,
    buffer_size=2048,
    no_search=False,
    full_utt=False,
    hmm=os.path.join(model_path, 'en-us'),
    lm=os.path.join(model_path, 'en-us.lm.bin'),
    dic=os.path.join(model_path, 'cmudict-en-us.dict')
)
for phrase in speech:
    print("phrase:", phrase)
    print(phrase.segments(detailed=True))
import os
from pocketsphinx import AudioFile, get_model_path, get_data_path

model_path = get_model_path()
print(model_path)
data_path = get_data_path()

'''
支持的文件格式:wav
音頻文件的解碼要求: 16KHz, 單聲道
'''
config = {
    'verbose': False,
    'audio_file': './data/output/1_1.wav',
    'buffer_size': 2048,
    'no_search': False,
    'full_utt': False,
    'hmm': os.path.join(model_path, 'en-us'), # 計算模型
    'lm': os.path.join(model_path, 'en-us.lm.bin'),#語言模型
    'dict': os.path.join(model_path, 'cmudict-en-us.dict')# 詞典模型
}

audio = AudioFile(**config)
for phrase in audio:
    print(phrase)

運行中文語言模型內容

參考博客: https://blog.csdn.net/zouxy09/article/details/14222605

 

添加中文語言模型和中文聲學模型

中文相關文件下載地址: https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/Mandarin/

  • 聲學模型:zh_broadcastnews_16k_ptm256_8000.tar.bz2
  • 語言模型:zh_broadcastnews_64000_utf8.DMP
  • 拼音字典:zh_broadcastnews_utf8.dic

拷貝到model文件夾下:

  • 將文件放到PHTHON_HOME的pocketsphinx模塊包下,我這里是在C:\Python36\Lib\site-packages\pocketsphinx\model

放代碼:沒有變化,只是加載的目錄文件變了。

import os
import os
from pocketsphinx import LiveSpeech, get_model_path

model_path = get_model_path()

speech = LiveSpeech(
    verbose=False,
    sampling_rate=16000,
    buffer_size=2048,
    no_search=False,
    full_utt=False,
    hmm=os.path.join(model_path, 'zh_cn.cd_cont_5000'),
    lm=os.path.join(model_path, 'zh_cn.lm.bin'),
    dic=os.path.join(model_path, 'zh_cn.dic')
)
for phrase in speech:
    print("phrase:", phrase)
    print(phrase.segments(detailed=True))
import os
from pocketsphinx import AudioFile, get_model_path, get_data_path

model_path = get_model_path()
print(model_path)
data_path = get_data_path()

'''
支持的文件格式:wav
音頻文件的解碼要求: 16KHz, 單聲道
'''
config = {
    'verbose': False,
    'audio_file': './data/output/1_1.wav',
    'buffer_size': 2048,
    'no_search': False,
    'full_utt': False,
    'hmm':os.path.join(model_path, 'zh_cn.cd_cont_5000'),
    'lm':os.path.join(model_path, 'zh_cn.lm.bin'),
    'dic':os.path.join(model_path, 'zh_cn.dic')
}

audio = AudioFile(**config)
for phrase in audio:
    print(phrase)

識別率不佳時的改進

通常,特別是針對指定詞典庫(.dic)和語言模型(lm)時,識別率通常都非常高. 對於識別率不高的情況, 可以從以下幾方面改進:

  • 采樣率和聲道. 音頻解碼時候的聲道與錄音時候的采樣率和聲道數不一致.
  • 聲學模型不一致.
  • 語言模型不一致.語言模型應該就是lm模型.
  • 詞典和詞語發音不一致. 也就是phonetic字典.:https://cmusphinx.github.io/wiki/tutorialtuning/

Lmtool: 語言模型庫工具

創建解碼器所必須的語言模型和詞典模型. 當前的lmtool只能用於美式英語.

首先,創建一個Corpus.txt文件(名字可以任意). 在文件中放進需要語料信息(短語, 短句子, 詞匯).

然后在這個網站里: http://www.speech.cs.cmu.edu/tools/lmtool-new.html

點擊Choose file, 上傳txt文件

點擊Compile knowle base網站會自動生成.dic和語言.lm模型文件等一系列文件.下載其中的.tgz文件,並解壓. 假設新生成的語言模型文件名為new_lm.lm, new_dic, 將這兩個文件保存到 在代碼中修改詞典模型和語言模型, 如下, 就可以實現模型的更新. 更新后識別率確實提高了不少。

config.set_string('-lm', os.path.join(MODELDIR, 'en-us/new_lm.lm')) #語言模型
config.set_string('-dict', os.path.join(MODELDIR, 'en-us/new_dic.dic')) # 詞典模型

運行自定義的中文語言模型內容

具體操作步驟

編輯一個自定義的keyword.txt文本,里面寫入打算喚醒的中文詞語,和發音可能混淆的詞(如果拼音相同只記錄一個就行)。再添加一些其他的亂七八糟的詞,這樣匹配的時候就不會一直匹配喚醒詞了。(喚醒詞的重點)。

以小貝為例,則keyword.txt中的內容如下:

小貝

小魏

巧倍

啊

呵呵

哈哈

么么噠

 

 

在[http://www.speech.cs.cmu.edu/tools/lmtool-new.html] 上面訓練上一步的keyword文本。會生成“隨機數.lm”和“隨機數.dic”,下載這兩個文件就可以。用來替代語言模型和拼音字典。

如:

1234.lm

1234.dic

編輯下載的隨機數.dic文件,對照着zh_broadcastnews_utf8.dic的拼音字典,更改成與其同樣格式的內容。原字典中不一定會有相同的詞語,有的話,就按照原先的寫,沒有的話,就按照單個發音的寫上就可以。

例如:

小貝 x i ao b ei

小魏 x i ao w ei

巧倍 q i ao b ei

啊 a as

.

.

.

在代碼中,替換掉對應的lm和dic路徑。

import os
from pocketsphinx import LiveSpeech, get_model_path

model_path = get_model_path()

speech = LiveSpeech(
    verbose=False,
    sampling_rate=16000,
    buffer_size=2048,
    no_search=False,
    full_utt=False,
    hmm=os.path.join(model_path, 'zh/zh_broadcastnews_16k_ptm256_8000'),
    lm=os.path.join(model_path, 'zh/1234.lm'),  # 這個目錄位置自己設置
    dic=os.path.join(model_path, 'zh/1234.dic')  # 同上
)
for phrase in speech:
    print("phrase:", phrase)
    print(phrase.segments(detailed=True))
    # 只要命中上述關鍵詞的內容,都算對
    if str(phrase) in ["小貝", "小魏", "巧倍"]:
    print("正確識別喚醒詞")

參考文獻及資源

王一蒙, 語音識別關鍵技術研究[D], 北京郵電大學

訓練自己語料庫的方法:

http://blog.csdn.net/x_r_su/article/details/53034371

[*]這篇博客很有借鑒意義:

http://blog.csdn.net/x_r_su/article/details/53032589

IRST LM Toolkit planning 構建大型語料庫的工具

A toolkit for language modeling.

https://sourceforge.net/projects/irstlm/?source=typ_redirect

Cmusphinx bug討論大匯總:

https://sourceforge.net/p/cmusphinx/bugs/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM