هذا هو PocketSphinx، أحد محركات المفردات الكبيرة مفتوحة المصدر في جامعة كارنيجي ميلون، ومحركات التعرف المستمر على الكلام المستقلة عن المتحدث.
على الرغم من أن هذا كان في وقت ما نظامًا بحثيًا، إلا أن التطوير النشط توقف إلى حد كبير وأصبح بعيدًا جدًا عن أحدث ما توصلت إليه التكنولوجيا. أقوم بإصدار بيان، لأن الأشخاص ما زالوا يستخدمونه، وهناك عدد من الأخطاء التاريخية في نظام البناء وواجهة برمجة التطبيقات التي تحتاج إلى تصحيح.
رقم الإصدار كبير بشكل غريب لأنه كان هناك "إصدار" يستخدمه الأشخاص يسمى 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
والذي كان بدوره يعتمد على بعض الأنظمة القديمة في جامعة كارنيجي ميلون، والتي تم إصدارها كبرنامج مجاني بموجب ترخيص يشبه BSD بفضل جهود Kevin Lenzo. تمت كتابة جزء كبير من وحدة فك التشفير على وجه الخصوص بواسطة Ravishankar Mosur (ابحث عن "rkm" في التعليقات)، لكن العديد من الأشخاص الآخرين ساهموا أيضًا، راجع ملف المؤلفين لمزيد من التفاصيل.
يعد David Huggins-Daines (مؤلف هذا المستند) مسؤولاً عن إنشاء PocketSphinx
الذي أضاف تحسينات متنوعة للسرعة والذاكرة، وحساب النقاط الثابتة، ودعم JSGF، وإمكانية النقل إلى منصات مختلفة، وواجهة برمجة تطبيقات متماسكة إلى حد ما. ثم اختفى لفترة من الوقت.
تولى نيكولاي شميريف مهمة الصيانة لفترة طويلة بعد ذلك، وساهم ألكسندر سولوفيتس وفياتشيسلاف كليمكوف وآخرون في الكثير من التعليمات البرمجية.
حاليًا يتم الحفاظ على هذا بواسطة David Huggins-Daines مرة أخرى.