這就是 PocketSphinx,卡內基美隆大學的開源大詞彙量、與說話者無關的連續語音辨識引擎之一。
儘管這曾經是一個研究系統,但積極的開發已基本停止,並且與最先進的水平相去甚遠。 我正在發布一個版本,因為人們仍在使用它,並且在建置系統和 API 中存在許多歷史錯誤需要修正。
版本號碼出奇地大,因為人們正在使用一個名為 5prealpha 的“版本”,從現在開始我們將使用正確的語義版本控制。
請參閱許可證文件以了解使用條款。
我們現在使用 CMake 進行構建,這應該在 Linux 和 Windows 上給出合理的結果。 不確定 Mac OS X,因為我沒有其中之一。 此外,從未在任何平台上真正建置或正常工作的音訊庫已被簡單地刪除。
不再有任何對 SphinxBase 的依賴。 不再有獅身人面像基地了。 這不是您要找的 SphinxBase。您所有的 SphinxBase 都屬於我們。
若要在虛擬環境中安裝 Python 模組(將~/ve_pocketsphinx
替換為您要建立的虛擬環境),請從頂層目錄:
python3 -m venv ~/ve_pocketsphinx . ~/ve_pocketsphinx/bin/activate pip install .
要安裝 C 庫和綁定(假設您有權限存取 /usr/local - 如果沒有,請使用-DCMAKE_INSTALL_PREFIX
在下面的第一個cmake
命令中設定不同的前綴):
cmake -S . -B build cmake --build build cmake --build build --target install
pocketsphinx
命令列程式從標準輸入或一個或多個檔案中讀取單通道 16 位元 PCM 音頻,並嘗試使用預設的聲學和語言模型來識別其中的語音。它接受大量您可能不關心的選項,預設為live
的命令,以及一個或多個輸入( align
模式除外),或-
從標準輸入讀取。
如果你有一個名為「speech.wav」的單通道 WAV 檔案並且你想識別其中的語音,你可以嘗試這樣做(結果可能不太好):
pocketsphinx single speech.wav
如果您的輸入是其他格式,我建議使用sox
轉換,如下所述。
命令如下:
help
:列印一長串您不關心的選項。
config
:將配置作為 JSON 轉儲到標準輸出(可以使用-config
選項載入)。
live
:偵測每個輸入中的語音片段,對它們執行辨識(使用您不關心的那些選項),並將結果以行分隔的 JSON 格式寫入標準輸出。 我意識到這不是最漂亮的格式,但它肯定勝過 XML。 每行都包含一個帶有這些欄位的 JSON 對象,這些欄位具有短名稱以使行更具可讀性:
b
:從串流開頭開始的開始時間(以秒為單位)
d
:持續時間(以秒為單位)
p
:辨識結果的估計機率,即0到1之間的數字,代表輸入根據模型的可能性
t
: 識別結果全文
w
:段列表(通常是單字),每個段依序包含b
、 d
、 p
和t
字段,分別表示單字的開始、結束、機率和文字。 如果-phone_align yes
已傳遞,則將出現一個w
字段,其中包含相同格式的電話分段。
single
:將每個輸入識別為單一話語,並以與上述相同的格式編寫 JSON 物件。
align
:將單一輸入檔案(或-
對於標準輸入)與單字序列對齊,並以與上述相同的格式寫入 JSON 物件。 第一個位置參數是輸入,所有後續位置參數都連接起來形成文本,以避免忘記引用它時出現意外。 您負責規範化文字以刪除標點符號、大寫字母、蜈蚣等。
pocketsphinx align goforward.wav "go forward ten meters"
預設情況下,僅進行字級對齊。 若要取得電話對齊,請在標誌中傳遞-phone_align yes
,例如:
pocketsphinx -phone_align yes align audio.wav $text
這將產生不太可讀的輸出,但您可以使用 jq 來清理它。 例如,您可以只取得單字名稱和開始時間,如下所示:
pocketsphinx align audio.wav $text | jq '.w[]|[.t,.b]'
或者您可以獲得電話名稱和持續時間,如下所示:
pocketsphinx -phone_align yes align audio.wav $text | jq '.w[]|.w[]|[.t,.d]'
當然,還有很多很多其他的可能性。
soxflags
:將參數傳回給sox
,這將建立適當的輸入格式。 請注意,因為sox
命令列有點奇怪,所以它們必須始終位於檔案名稱或-d
之後(告訴sox
從麥克風讀取)。您可以像這樣運行即時識別:
sox -d $(pocketsphinx soxflags) | pocketsphinx -
或從名為“audio.mp3”的檔案中解碼,如下所示:
sox audio.mp3 $(pocketsphinx soxflags) | pocketsphinx -
預設情況下,僅將錯誤列印到標準錯誤,但如果您想要更多訊息,可以傳遞-loglevel INFO
。 部分結果不會印出來,也許將來會印出來,但不要屏住呼吸。
對於編程,請參閱範例目錄,以了解使用 C 和 Python 庫的許多範例。 您也可以閱讀 Python API 或 C API 的文檔
PocketSphinx 最終基於Sphinx-II
而 Sphinx-II 又基於卡內基美隆大學的一些舊系統,由於 Kevin Lenzo 的努力,這些系統在類似 BSD 的許可證下作為自由軟體發布。 解碼器的大部分內容是由 Ravishankar Mosur 編寫的(在評論中查找“rkm”),但其他許多人也做出了貢獻,請參閱作者文件以獲取更多詳細資訊。
David Huggins-Daines(本文檔的作者)負責創建PocketSphinx
,它添加了各種速度和內存優化、定點計算、JSGF 支援、各種平台的可移植性以及有些連貫的 API。 隨後他消失了一段時間。
此後相當長一段時間由 Nickolay Shmyrev 接手維護,大量代碼由 Alexander Solovets、Vyacheslav Klimkov 等人貢獻。
目前,它再次由 David Huggins-Daines 維護。