นี่คือ PocketSphinx หนึ่งในคำศัพท์ขนาดใหญ่แบบโอเพ่นซอร์สของมหาวิทยาลัย Carnegie Mellon ซึ่งเป็นกลไกการรู้จำเสียงพูดต่อเนื่องที่เป็นอิสระจากผู้พูด
แม้ว่านี่จะเป็นจุดหนึ่งของระบบการวิจัย แต่การพัฒนาเชิงรุกได้หยุดลงไปมากแล้ว และมันห่างไกลจากความทันสมัยไปมาก ฉันกำลังเผยแพร่ เนื่องจากผู้คนยังคงใช้งานมันอยู่ และมีข้อผิดพลาดในอดีตจำนวนหนึ่งในระบบบิลด์และ API ซึ่งจำเป็นต้องได้รับการแก้ไข
หมายเลขเวอร์ชันมีขนาดใหญ่ผิดปกติเนื่องจากมี "การเปิดตัว" ที่ผู้คนใช้เรียกว่า 5prealpha และเราจะใช้เวอร์ชันความหมายที่เหมาะสมนับจากนี้เป็นต้นไป
โปรดดูไฟล์ใบอนุญาตสำหรับข้อกำหนดการใช้งาน
ตอนนี้เราใช้ CMake เพื่อสร้าง ซึ่งควรให้ผลลัพธ์ที่สมเหตุสมผลทั่วทั้ง Linux และ Windows ไม่แน่ใจเกี่ยวกับ Mac OS X เพราะฉันไม่มีอย่างใดอย่างหนึ่ง นอกจากนี้ ไลบรารีเสียงซึ่งไม่เคยสร้างหรือทำงานอย่างถูกต้องบนแพลตฟอร์มใดๆ เลย ได้ถูกลบออกไปแล้ว
ไม่มีการพึ่งพา SphinxBase อีกต่อไป ไม่มี 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
อ่านเสียง PCM 16 บิตแชนเนลเดียวจากอินพุตมาตรฐานหรือไฟล์ตั้งแต่หนึ่งไฟล์ขึ้นไป และพยายามจดจำคำพูดในนั้นโดยใช้โมเดลเสียงและภาษาดีฟอลต์ ยอมรับตัวเลือกจำนวนมากที่คุณอาจไม่สนใจ คำสั่ง ที่มีค่าเริ่มต้นเป็น live
และอินพุตตั้งแต่หนึ่งรายการขึ้นไป (ยกเว้นในโหมด align
) หรือ -
เพื่ออ่านจากอินพุตมาตรฐาน
หากคุณมีไฟล์ WAV ช่องเดียวชื่อ "speech.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
ซึ่งในทางกลับกันก็มีพื้นฐานมาจากระบบเก่าบางระบบที่ Carnegie Mellon University ซึ่งเปิดตัวเป็นซอฟต์แวร์ฟรีภายใต้ลิขสิทธิ์แบบ BSD ต้องขอบคุณความพยายามของ Kevin Lenzo ตัวถอดรหัสส่วนใหญ่เขียนโดย Ravishankar Mosur (มองหา "rkm" ในความคิดเห็น) แต่บุคคลอื่นอีกหลายคนก็มีส่วนร่วมเช่นกัน โปรดดูไฟล์ AUTHORS สำหรับรายละเอียดเพิ่มเติม
David Huggins-Daines (ผู้เขียนเอกสารนี้) มีหน้าที่รับผิดชอบในการสร้าง PocketSphinx
ซึ่งเพิ่มการเพิ่มประสิทธิภาพความเร็วและหน่วยความจำต่างๆ การคำนวณแบบจุดคงที่ การรองรับ JSGF การพกพาไปยังแพลตฟอร์มต่างๆ และ API ที่ค่อนข้างสอดคล้องกัน แล้วเขาก็หายไปสักพักหนึ่ง
หลังจากนั้น Nickolay Shmyrev เข้ามาดูแลการบำรุงรักษาเป็นเวลานาน และ Alexander Solovets, Vyacheslav Klimkov และคนอื่นๆ ก็ได้ร่วมสนับสนุนโค้ดจำนวนมาก
ปัจจุบันนี้ได้รับการดูแลโดย David Huggins-Daines อีกครั้ง