
Pykaldi هي طبقة برمجة للبرمجة في Python لمجموعة أدوات Kaldi التعرف على الكلام. إنه يوفر أغلفة بيثون سهلة الاستخدام ، منخفضة الرأس ، من الدرجة الأولى لرمز C ++ في مكتبات Kaldi و OpenFst. يمكنك استخدام Pykaldi لكتابة رمز Python للأشياء التي قد تتطلب كتابة رمز C ++ مثل استدعاء وظائف Kaldi منخفضة المستوى ، أو معالجة كائنات Kaldi و OpenFst في الكود أو تنفيذ أدوات Kaldi الجديدة.
يمكنك التفكير في Kaldi كمربع كبير من Legos يمكنك مزجها ومطابقةها لبناء حلول مخصصة للتعرف على الكلام. أفضل طريقة للتفكير في Pykaldi هي كملحق ، وصاحب جانبي إذا صح التعبير ، إلى Kaldi. في الواقع ، بيكالدي في أفضل حالاته عندما يتم استخدامه إلى جانب Kaldi. تحقيقًا لهذه الغاية ، يعد تكرار وظائف أدوات سطر الأوامر التي لا تعد ولا تحصى ، ونصوص فائدة ، ووصفات على مستوى الصدفة المقدمة من Kaldi ، غير مهدئة لمشروع Pykaldi.
مثل Kaldi ، يهدف Pykaldi في المقام الأول للباحثين عن التعرف على الكلام والمهنيين. إنه معبأ بالأشياء الجيدة التي يحتاجها المرء إلى بناء برامج Python تستفيد من المجموعة الواسعة من المرافق والخوارزميات وهياكل البيانات التي توفرها مكتبات Kaldi و OpenFST.
إذا لم تكن على دراية بالتعرف على الكلام المستند إلى FST أو ليس لديك مصلحة في الوصول إلى شجاعة Kaldi و OpenFst في Python ، ولكن لا تريد فقط تشغيل نظام Kaldi الذي تم تدريبه مسبقًا كجزء من تطبيق Python الخاص بك ، لا تقلق. يتضمن Pykaldi عددًا من الوحدات النمطية ذات الطلبات العالية ، مثل asr ، alignment segmentation ، والتي يجب أن تكون في متناول معظم مبرمجي Python.
إذا كنت مهتمًا باستخدام Pykaldi للبحث أو بناء تطبيقات ASR المتقدمة ، فأنت محظوظ. يأتي Pykaldi مع كل ما تحتاجه لقراءته أو الكتابة أو فحص أو معالجة أو تصور كائنات Kaldi و OpenFst في Python. ويشمل أغلفة Python لمعظم الوظائف والأساليب التي تشكل جزءًا من واجهات برمجة التطبيقات العامة في مكتبات Kaldi و OpenFst C ++. إذا كنت ترغب في قراءة/كتابة الملفات التي يتم إنتاجها/استهلاكها بواسطة أدوات Kaldi ، تحقق من مرافق I/O و Table في حزمة util . إذا كنت ترغب في العمل مع مصفوفات Kaldi ومتجهات ، على سبيل المثال ، قم بتحويلها إلى ndarrays Numpy والعكس ، تحقق من حزمة matrix . إذا كنت ترغب في استخدام Kaldi لاستخراج الميزات وتحويلها ، تحقق من الحزم feat ، ivector و transform . إذا كنت ترغب في العمل مع الشاشات أو هياكل FST الأخرى التي يتم إنتاجها/استهلاكها بواسطة أدوات Kaldi ، تحقق من حزم fstext و lat و kws . إذا كنت تريد الوصول منخفض المستوى إلى نماذج الخليط الغوسي أو نماذج ماركوف المخفية أو أشجار القرار الصوتي في Kaldi ، تحقق من حزم gmm و sgmm2 و hmm و tree . إذا كنت ترغب في الوصول إلى طرز شبكة Kaldi Neural Network ، تحقق من حزم nnet3 و cudamatrix وسلسلة chain . إذا كنت ترغب في استخدام أجهزة فك التشفير وأدوات نمذجة اللغة في Kaldi ، تحقق من decoder و lm و rnnlm و tfrnnlm و online2 .
قد يجد القراء المهتمين الذين يرغبون في معرفة المزيد عن Kaldi و Pykaldi الموارد التالية مفيدة:
نظرًا لأن التعرف التلقائي على الكلام (ASR) في Python هو بلا شك "تطبيق Killer" لـ Pykaldi ، فسنذهب إلى عدد قليل من سيناريوهات ASR للتعرف على API Pykaldi. يجب أن نلاحظ أن Pykaldi لا يوفر أي أدوات مساعدة عالية المستوى لتدريب نماذج ASR ، لذلك تحتاج إلى تدريب النماذج الخاصة بك باستخدام وصفات Kaldi أو استخدام النماذج المدربة مسبقًا متوفرة عبر الإنترنت. السبب في ذلك هو ذلك ببساطة لأنه لا يوجد واجهة برمجة تطبيقات ASR عالية المستوى في مكتبات Kaldi C ++. يتم تدريب نماذج Kaldi ASR باستخدام وصفات معقدة على مستوى الصدفة تتعامل مع كل شيء من إعداد البيانات إلى تنسيق عدد لا يحصى من المنافسات التنفيذية المستخدمة في التدريب. هذا حسب التصميم ومن غير المرجح أن يتغير في المستقبل. يوفر Pykaldi أغلفة لأدوات التدريب ASR منخفضة المستوى في مكتبات Kaldi C ++ ، لكن هذه ليست مفيدة حقًا إلا إذا كنت ترغب في إنشاء خط أنابيب تدريب ASR في بيثون من لبنات البناء الأساسية ، وهي ليست مهمة سهلة. مع الاستمرار في تشبيه LEGO ، فإن هذه المهمة أقرب إلى بناء هذا الوصول إلى شاحنة مليئة بـ LEGOs التي قد تحتاجها. إذا كنت مجنونًا بما يكفي لمحاولة ، فلا تدع هذه الفقرة تثبطك. قبل أن نبدأ في بناء بيكالدي ، اعتقدنا أنها كانت مهمة رجل مجنون أيضًا.
تتضمن وحدة Pykaldi asr عددًا من الفصول السهلة الاستخدام والعالية المستوى لجعلها سهلة في وضع أنظمة ASR في Python. يمكن أن يكون تجاهل رمز Boilerplate اللازم لإعداد الأشياء ، والقيام ASR مع Pykaldi بسيطًا مثل مقتطف الكود التالي:
asr = SomeRecognizer . from_files ( "final.mdl" , "HCLG.fst" , "words.txt" , opts )
with SequentialMatrixReader ( "ark:feats.ark" ) as feats_reader :
for key , feats in feats_reader :
out = asr . decode ( feats )
print ( key , out [ "text" ]) words.txt HCLG.fst المثال المبسط ، قمنا أولاً بتسوية معرف التعرف الافتراضي SomeRecognizer مع مسارات النموذج final.mdl يحتوي كائن opts على خيارات التكوين لمؤسسة التعرف. بعد ذلك ، نستند إلى إنشاء قارئ جدول Pykaldi SequentialMatrixReader لقراءة مصفوفات الميزات المخزنة في Kaldi Archive feats.ark . أخيرًا ، نتكرر على مصفوفات الميزة ونفصلها واحدًا تلو الآخر. نحن هنا نقوم ببساطة بطباعة أفضل فرضية ASR لكل كلام ، لذلك نحن مهتمون فقط بإدخال "text" لقاموس out . ضع في اعتبارك أن قاموس الإخراج يحتوي على مجموعة من الإدخالات المفيدة الأخرى ، مثل محاذاة مستوى الإطار لأفضل فرضية وشبكة مرجحة تمثل الفرضيات الأكثر احتمالًا. من المسلم به أن جميع خطوط أنابيب ASR لن تكون بسيطة مثل هذا المثال ، ولكن في كثير من الأحيان سيكون لها نفس الهيكل العام. في الأقسام التالية ، سنرى كيف يمكننا تكييف الكود المذكور أعلاه لتنفيذ خطوط أنابيب ASR أكثر تعقيدًا.
هذا هو السيناريو الأكثر شيوعا. نريد أن نفعل ASR في وضع عدم الاتصال باستخدام نماذج Kaldi المدربة مسبقًا ، مثل نماذج سلسلة Aspire. نحن هنا نستخدم مصطلح "النماذج" بشكل فضفاض للإشارة إلى كل ما يحتاج المرء إلى تجميع نظام ASR. في هذا المثال المحدد ، سنحتاج:
لاحظ أنه يمكنك استخدام رمز المثال هذا لفك التشفير مع نماذج سلسلة Aspire.
from kaldi . asr import NnetLatticeFasterRecognizer
from kaldi . decoder import LatticeFasterDecoderOptions
from kaldi . nnet3 import NnetSimpleComputationOptions
from kaldi . util . table import SequentialMatrixReader , CompactLatticeWriter
# Set the paths and read/write specifiers
model_path = "models/aspire/final.mdl"
graph_path = "models/aspire/graph_pp/HCLG.fst"
symbols_path = "models/aspire/graph_pp/words.txt"
feats_rspec = ( "ark:compute-mfcc-feats --config=models/aspire/conf/mfcc.conf "
"scp:wav.scp ark:- |" )
ivectors_rspec = ( feats_rspec + "ivector-extract-online2 "
"--config=models/aspire/conf/ivector_extractor.conf "
"ark:spk2utt ark:- ark:- |" )
lat_wspec = "ark:| gzip -c > lat.gz"
# Instantiate the recognizer
decoder_opts = LatticeFasterDecoderOptions ()
decoder_opts . beam = 13
decoder_opts . max_active = 7000
decodable_opts = NnetSimpleComputationOptions ()
decodable_opts . acoustic_scale = 1.0
decodable_opts . frame_subsampling_factor = 3
asr = NnetLatticeFasterRecognizer . from_files (
model_path , graph_path , symbols_path ,
decoder_opts = decoder_opts , decodable_opts = decodable_opts )
# Extract the features, decode and write output lattices
with SequentialMatrixReader ( feats_rspec ) as feats_reader ,
SequentialMatrixReader ( ivectors_rspec ) as ivectors_reader ,
CompactLatticeWriter ( lat_wspec ) as lat_writer :
for ( fkey , feats ), ( ikey , ivectors ) in zip ( feats_reader , ivectors_reader ):
assert ( fkey == ikey )
out = asr . decode (( feats , ivectors ))
print ( fkey , out [ "text" ])
lat_writer [ fkey ] = out [ "lattice" ] الفرق الأساسي بين هذا المثال والمقتطف القصير من القسم الأخير هو أننا نقرأ لكل كلام بيانات الصوت الخام من القرص وحساب مصفومين ميزة على الطيران بدلاً من قراءة مصفوفة ميزة واحدة من القرص. يحتوي ملف البرنامج النصي wav.scp على قائمة بملفات WAV المقابلة للكلمات التي نريد فك تشفيرها. تحتوي مصفوفة الميزات الإضافية التي نستخرجها على محركات I على الإنترنت التي تستخدمها النموذج الصوتي للشبكة العصبية لأداء قناة وتكييف مكبر الصوت. يتم استخدام spk2utt من مكبر الصوت إلى الإرهاق لتجميع إحصائيات منفصلة لكل مكبر صوت في استخراج I-vector عبر الإنترنت. يمكن أن يكون رسم خرائط للهوية بسيطة إذا لم تكن معلومات السماعة متوفرة. نقوم بتعبئة ميزات MFCC ومحلات I في tuple ونمر هذا النقل إلى معرف لفك التشفير. تعرف معرفات الشبكة العصبية في Pykaldi كيفية التعامل مع ميزات I-Vector الإضافية عند توفرها. يحتوي ملف النموذج final.mdl على كل من نموذج الانتقال والنموذج الصوتي للشبكة العصبية. تتميز عمليات NnetLatticeFasterRecognizer بمصفوفات عن طريق حساب احتمالية سجل الهاتف الأولى باستخدام النموذج الصوتي للشبكة العصبية ، ثم قم بتخطيطها إلى محلات السجلات الانتقالية باستخدام نموذج الانتقال وأخيراً فك رموز سجلات Transition Transitions في التسلسلات باستخدام Decoding Graph HCLG.fst ، والتي تحتوي على معرفات التحول في الإدخال. بعد فك التشفير ، نقوم بإنقاذ الشبكة التي تم إنشاؤها بواسطة ANDISER لأرشيف Kaldi للمعالجة المستقبلية.
يوضح هذا المثال أيضًا آليات الإدخال/الإخراج القوية التي توفرها Kaldi. بدلاً من تنفيذ خطوط أنابيب استخراج الميزات في الكود ، نقوم بتعريفها على أنها Kaldi يقرأ المحددات وحساب مصفوفات الميزات ببساطة عن طريق إنشاء قراء Table Pykaldi والتكرار عليها. هذا ليس فقط أبسط طريقة ولكن أيضًا أسرع طريقة لحساب ميزات Pykaldi نظرًا لأن خط أنابيب استخراج الميزات يتم تشغيله بالتوازي بواسطة نظام التشغيل. وبالمثل ، فإننا نستخدم محددًا للكتابة Kaldi لإنشاء إنشاء كاتب طاولة Pykaldi الذي يكتب شاشات الإخراج إلى أرشيف Kaldi مضغوط. لاحظ أنه لكي يعمل هؤلاء ، نحتاج إلى compute-mfcc-feats و ivector-extract-online2 و gzip ليكونوا في PATH .
هذا مشابه للسيناريو السابق ، ولكن بدلاً من نموذج Kaldi Acoustic ، نستخدم نموذج Pytorch الصوتي. بعد حساب الميزات كما كان من قبل ، نقوم بتحويلها إلى موتر Pytorch ، ونقوم بالتمريرة الأمامية باستخدام وحدة الشبكة العصبية Pytorch التي تخرج احتمالية سجل الهاتف في Pytorch ، وأخيراً تحويل هذه الاحتمالات السجلات إلى مصفوفة Pykaldi لفك تشفيرها. يستخدم التعرف على نموذج الانتقال لتحديد معرفات الهاتف تلقائيًا إلى معرفات النقل ، وملصقات الإدخال على رسم بياني فك تشفير Kaldi نموذجي.
from kaldi . asr import MappedLatticeFasterRecognizer
from kaldi . decoder import LatticeFasterDecoderOptions
from kaldi . matrix import Matrix
from kaldi . util . table import SequentialMatrixReader , CompactLatticeWriter
from models import AcousticModel # Import your PyTorch model
import torch
# Set the paths and read/write specifiers
acoustic_model_path = "models/aspire/model.pt"
transition_model_path = "models/aspire/final.mdl"
graph_path = "models/aspire/graph_pp/HCLG.fst"
symbols_path = "models/aspire/graph_pp/words.txt"
feats_rspec = ( "ark:compute-mfcc-feats --config=models/aspire/conf/mfcc.conf "
"scp:wav.scp ark:- |" )
lat_wspec = "ark:| gzip -c > lat.gz"
# Instantiate the recognizer
decoder_opts = LatticeFasterDecoderOptions ()
decoder_opts . beam = 13
decoder_opts . max_active = 7000
asr = MappedLatticeFasterRecognizer . from_files (
transition_model_path , graph_path , symbols_path , decoder_opts = decoder_opts )
# Instantiate the PyTorch acoustic model (subclass of torch.nn.Module)
model = AcousticModel (...)
model . load_state_dict ( torch . load ( acoustic_model_path ))
model . eval ()
# Extract the features, decode and write output lattices
with SequentialMatrixReader ( feats_rspec ) as feats_reader ,
CompactLatticeWriter ( lat_wspec ) as lat_writer :
for key , feats in feats_reader :
feats = torch . from_numpy ( feats . numpy ()) # Convert to PyTorch tensor
loglikes = model ( feats ) # Compute log-likelihoods
loglikes = Matrix ( loglikes . numpy ()) # Convert to PyKaldi matrix
out = asr . decode ( loglikes )
print ( key , out [ "text" ])
lat_writer [ key ] = out [ "lattice" ]هذا القسم هو عنصر نائب. تحقق من هذا البرنامج النصي في هذه الأثناء.
تعتبر Lattice Rescoring تقنية قياسية لاستخدام نماذج لغة N-Gram الكبيرة أو نماذج لغة الشبكة العصبية المتكررة (RNNLMS) في ASR. في هذا المثال ، نقوم بإنقاذ الشاشات باستخدام Kaldi Rnnlm. نقوم أولاً بتسهيل عملية الإنقاذ من خلال توفير مسارات النماذج. ثم نستخدم قارئ طاولة للتكرار عبر الشبكات التي نريد إنقاذها وأخيراً نستخدم كاتب طاولة لكتابة الشبكات التي تم إنقاذه إلى القرص.
from kaldi . asr import LatticeRnnlmPrunedRescorer
from kaldi . fstext import SymbolTable
from kaldi . rnnlm import RnnlmComputeStateComputationOptions
from kaldi . util . table import SequentialCompactLatticeReader , CompactLatticeWriter
# Set the paths, extended filenames and read/write specifiers
symbols_path = "models/tedlium/config/words.txt"
old_lm_path = "models/tedlium/data/lang_nosp/G.fst"
word_feats_path = "models/tedlium/word_feats.txt"
feat_embedding_path = "models/tedlium/feat_embedding.final.mat"
word_embedding_rxfilename = ( "rnnlm-get-word-embedding %s %s - |"
% ( word_feats_path , feat_embedding_path ))
rnnlm_path = "models/tedlium/final.raw"
lat_rspec = "ark:gunzip -c lat.gz |"
lat_wspec = "ark:| gzip -c > rescored_lat.gz"
# Instantiate the rescorer
symbols = SymbolTable . read_text ( symbols_path )
opts = RnnlmComputeStateComputationOptions ()
opts . bos_index = symbols . find_index ( "<s>" )
opts . eos_index = symbols . find_index ( "</s>" )
opts . brk_index = symbols . find_index ( "<brk>" )
rescorer = LatticeRnnlmPrunedRescorer . from_files (
old_lm_path , word_embedding_rxfilename , rnnlm_path , opts = opts )
# Read the lattices, rescore and write output lattices
with SequentialCompactLatticeReader ( lat_rspec ) as lat_reader ,
CompactLatticeWriter ( lat_wspec ) as lat_writer :
for key , lat in lat_reader :
lat_writer [ key ] = rescorer . rescore ( lat ) لاحظ اسم الملف الممتد الذي استخدمناه لحساب كلمة تضمينات من ميزات الكلمة وتضمينات الميزة أثناء الطيران. وتجدر الإشارة أيضًا إلى مواصفات القراءة/الكتابة التي استخدمناها لإلغاء ضغط/ضغط محفوظات الشبكة بشفافية. لكي يعمل هؤلاء ، نحتاج إلى أن يكون rnnlm-get-word-embedding و gunzip و gzip في PATH .
يهدف Pykaldi إلى سد الفجوة بين Kaldi وجميع الأشياء اللطيفة التي يقدمها Python. إنها أكثر من مجرد مجموعة من الارتباطات في مكتبات Kaldi. إنها طبقة نصية توفر دعمًا من الدرجة الأولى لأنواع Kaldi و OpenFST الأساسية في Python. يتم دمج أنواع Pykaldi متجه ومصفوفة بإحكام مع Numpy. يمكن تحويلها بسلاسة إلى صفائف numpy والعكس صحيح دون نسخ مخازن الذاكرة الأساسية. أنواع Pykaldi FST ، بما في ذلك شبكات Kaldi Style ، هم مواطنون من الدرجة الأولى في بيثون. يتم تعريف واجهة برمجة التطبيقات (API) الخاصة بالمستخدم الذي يواجه أنواع FST والعمليات تقريبًا في Python الذي يحاكي واجهة برمجة التطبيقات المكشوفة بواسطة Pywrapfst ، غلاف Python الرسمي لـ OpenFst.
يسخر Pykaldi قوة CLIF لالتفاف Kaldi و OpenFst C ++ باستخدام أوصاف API البسيطة. يمكن استيراد وحدات تمديد Cpython التي تم إنشاؤها بواسطة CLIF في Python للتفاعل مع Kaldi و OpenFST. في حين أن CLIF أمر رائع لفضح API C ++ الحالي في Python ، فإن الأغلفة لا تعرض دائمًا واجهة برمجة تطبيقات "Pythonic" سهلة الاستخدام من Python. يعالج Pykaldi هذا عن طريق تمديد مغلفات Clif الخام في Python (وأحيانًا في C ++) لتوفير واجهة برمجة تطبيقات أكثر "Pythonic". يوضح الشكل أدناه حيث يناسب بيكالدي في النظام الإيكولوجي Kaldi.

لدى Pykaldi تصميم معياري مما يجعل من السهل الحفاظ عليها وتمديدها. يتم تنظيم ملفات المصدر في شجرة دليل وهي نسخة طبق الأصل من شجرة مصدر Kaldi. يحدد كل دليل الحزمة الفرعية ويحتوي فقط على رمز التفاف المكتوب لمكتبة Kaldi المرتبطة. يتكون رمز الغلاف من:
أوصاف API Clif C ++ التي تحدد الأنواع والوظائف المراد لفها و API Python ،
رؤوس C ++ التي تحدد الحشوات لرمز Kaldi غير متوافق مع نمط Google C ++ المتوقع بواسطة CLIF ،
تقوم وحدات Python بتجميع وحدات التمديد ذات الصلة التي تم إنشاؤها مع CLIF وتمديد أغلفة CLIF الخام لتوفير واجهة برمجة تطبيقات أكثر "Pythonic".
يمكنك قراءة المزيد حول التصميم والتفاصيل الفنية لـ Pykaldi في ورقتنا.
يوضح الجدول التالي حالة كل حزمة Pykaldi (لا نخطط حاليًا لإضافة دعم لـ NNET و NNET2 وعبر الإنترنت) على طول الأبعاد التالية:
| طَرد | ملفوفة؟ | بيثوني؟ | الوثائق؟ | اختبارات؟ |
|---|---|---|---|---|
| قاعدة | ✔ | ✔ | ✔ ✔ ✔ | ✔ |
| سلسلة | ✔ | ✔ | ✔ ✔ ✔ | |
| Cudamatrix | ✔ | ✔ | ✔ | |
| فك التشفير | ✔ | ✔ | ✔ ✔ ✔ | |
| العمل الفذ | ✔ | ✔ | ✔ ✔ ✔ | |
| fStext | ✔ | ✔ | ✔ ✔ ✔ | |
| GMM | ✔ | ✔ | ✔ ✔ | ✔ |
| همم | ✔ | ✔ | ✔ ✔ ✔ | ✔ |
| العربات | ✔ | ✔ | ||
| KWS | ✔ | ✔ | ✔ ✔ ✔ | |
| لات | ✔ | ✔ | ✔ ✔ ✔ | |
| LM | ✔ | ✔ | ✔ ✔ ✔ | |
| المصفوفة | ✔ | ✔ | ✔ ✔ ✔ | ✔ |
| nnet3 | ✔ | ✔ | ✔ | |
| Online2 | ✔ | ✔ | ✔ ✔ ✔ | |
| rnnlm | ✔ | ✔ | ✔ ✔ ✔ | |
| SGMM2 | ✔ | ✔ | ||
| tfrnnlm | ✔ | ✔ | ✔ ✔ ✔ | |
| تحول | ✔ | ✔ | ✔ | |
| شجرة | ✔ | ✔ | ||
| استخدام | ✔ | ✔ | ✔ ✔ ✔ | ✔ |
إذا كنت تستخدم Linux أو MacOS حديثًا نسبيًا ، مثل Ubuntu> = 16.04 أو CentOS> = 7 أو MacOS> = 10.13 ، فيجب أن تكون قادرًا على تثبيت Pykaldi دون الكثير من المتاعب. خلاف ذلك ، ستحتاج على الأرجح إلى تعديل نصوص التثبيت.
يمكنك الآن تنزيل حزم WHL الرسمية من صفحة إصدار GitHub الخاصة بنا. لدينا حزم WHL لـ Python 3.7 ، 3.8 ، ... ، 3.11 على Linux وبعض (تجريبي) يبني Mac M1/M2.
إذا قررت استخدام حزمة WHL ، فيمكنك تخطي الأقسام التالية والتوجه مباشرة إلى "بدء مشروع جديد مع حزمة Pykaldi WHL" لإعداد مشروعك. لاحظ أنك لا تزال بحاجة إلى تجميع نسخة متوافقة مع Pykaldi من Kaldi.
لتثبيت وبناء Pykaldi من المصدر ، اتبع الخطوات الواردة أدناه.
git clone https://github.com/pykaldi/pykaldi.git
cd pykaldiعلى الرغم من أنه غير مطلوب ، فإننا نوصي بتثبيت Pykaldi وجميع تبعيات Python داخل بيئة Python جديدة معزولة. إذا كنت لا ترغب في إنشاء بيئة بيثون جديدة ، فيمكنك تخطي بقية هذه الخطوة.
يمكنك استخدام أي أداة تريدها لإنشاء بيئة Python جديدة. هنا نستخدم virtualenv ، ولكن يمكنك استخدام أداة أخرى مثل conda إذا كنت تفضل ذلك. تأكد من تنشيط بيئة Python الجديدة قبل الاستمرار مع بقية التثبيت.
virtualenv env
source env/bin/activateسيقوم تشغيل الأوامر أدناه بتثبيت حزم النظام اللازمة لبناء Pykaldi من المصدر.
# Ubuntu
sudo apt-get install autoconf automake cmake curl g++ git graphviz
libatlas3-base libtool make pkg-config subversion unzip wget zlib1g-dev
# macOS
brew install automake cmake git graphviz libtool pkg-config wget gnu-sed openblas subversion
PATH= " /opt/homebrew/opt/gnu-sed/libexec/gnubin: $PATH "سيقوم تشغيل الأوامر أدناه بتثبيت حزم Python اللازمة لبناء Pykaldi من المصدر.
pip install --upgrade pip
pip install --upgrade setuptools
pip install numpy pyparsing
pip install ninja # not required but strongly recommendedبالإضافة إلى الحزم المذكورة أعلاه ، نحتاج أيضًا إلى تثبيتات متوافقة مع Pykaldi للبرنامج التالي:
Google Protobuf ، الموصى به V3.5.0. يجب تثبيت كل من مكتبة C ++ وحزمة Python.
شوكة بيكالدي متوافقة مع CLIF. لتبسيط تطوير Pykaldi ، قمنا بإجراء بعض التغييرات على قاعدة كود كود. نحن نأمل في المنبع هذه التغييرات مع مرور الوقت. هذه التغييرات موجودة في فرع بيكالدي:
# This command will be automatically run for you in the tools install scripts.
git clone -b pykaldi https://github.com/pykaldi/clif # This command will be automatically run for you in the tools install scripts.
git clone -b pykaldi https://github.com/pykaldi/kaldi يمكنك استخدام البرامج النصية في دليل tools لتثبيت أو تحديث هذه البرامج محليًا. تأكد من التحقق من إخراج هذه البرامج النصية. إذا لم ترى Done installing {protobuf,CLIF,Kaldi} المطبوعة في النهاية ، فهذا يعني أن التثبيت قد فشل لسبب ما.
cd tools
./check_dependencies.sh # checks if system dependencies are installed
./install_protobuf.sh # installs both the C++ library and the Python package
./install_clif.sh # installs both the C++ library and the Python package
./install_kaldi.sh # installs the C++ library
cd ..ملاحظة ، إذا كنت تقوم بتجميع Kaldi على Apple Silicion و.
SCTK_CXFLAGS = -w # -march=native إذا تم تثبيت Kaldi داخل دليل tools وتم تثبيت جميع تبعيات Python (Numpy ، pyparsing ، pyclif ، protobuf) في بيئة Python النشطة ، يمكنك تثبيت Pykaldi مع الأمر التالي.
python setup.py installبمجرد التثبيت ، يمكنك تشغيل اختبارات Pykaldi مع الأمر التالي.
python setup.py testيمكنك أيضًا إنشاء حزمة WHL. تجعل حزمة WHL من السهل تثبيت Pykaldi في بيئة مشروع جديدة لمشروع الكلام الخاص بك.
python setup.py bdist_wheelيمكن بعد ذلك العثور على ملف WHL في مجلد "DIST". يعتمد اسم ملف WHL على إصدار Pykaldi ، وإصدار Python الخاص بك والهندسة المعمارية. للحصول على Python 3.9 بناء على x86_64 مع Pykaldi 0.2.2 قد يبدو:
إنشاء مجلد مشروع جديد ، على سبيل المثال:
mkdir -p ~ /projects/myASR
cd ~ /projects/myASRقم بإنشاء وتنشيط بيئة افتراضية بنفس إصدار Python مثل حزمة WHL ، على سبيل المثال لـ Python 2.9:
virtualenv -p /usr/bin/python3.9 myasr_env
. myasr_env/bin/activateقم بتثبيت Numpy و Pykaldi في بيئة MyASR الخاصة بك:
pip3 install numpy
pip3 install pykaldi-0.2.2-cp39-cp39-linux_x86_64.whl نسخ Pykaldi/أدوات/install_kaldi.sh إلى مشروع MyASR الخاص بك. استخدم البرنامج النصي install_kaldi.sh لتثبيت إصدار kaldi متوافق مع Pykaldi لمشروعك:
./install_kaldi.shنسخ Pykaldi/أدوات/path.sh إلى مشروعك. يتم استخدام Path.sh لجعل Pykaldi تجد مكتبات Kaldi و Binaries في مجلد Kaldi. Source Path.sh مع:
. path.shتهانينا ، أنت مستعد لاستخدام Pykaldi في مشروعك!
ملاحظة: في أي وقت تفتح فيه قذيفة جديدة ، تحتاج إلى الحصول على بيئة المشروع و Path.sh:
. myasr_env/bin/activate
. path.shملاحظة: للأسف ، فإن حزم Pykaldi Conda عفا عليها الزمن. إذا كنت ترغب في الحفاظ عليها ، فيرجى الاتصال بنا.
لتثبيت Pykaldi بدعم CUDA:
conda install -c pykaldi pykaldiلتثبيت Pykaldi دون دعم CUDA (وحدة المعالجة المركزية فقط):
conda install -c pykaldi pykaldi-cpuلاحظ أن حزمة Pykaldi Conda لا توفر Kaldi Executibes. إذا كنت ترغب في استخدام Kaldi Executions مع Pykaldi ، على سبيل المثال ، كجزء من محددات القراءة/الكتابة ، فأنت بحاجة إلى تثبيت Kaldi بشكل منفصل.
ملاحظة: قد تكون تعليمات Docker أدناه قديمة. إذا كنت ترغب في الحفاظ على صورة Docker لـ Pykaldi ، فيرجى الاتصال بنا.
إذا كنت ترغب في استخدام Pykaldi داخل حاوية Docker ، فاتبع التعليمات الواردة في مجلد docker .
بشكل افتراضي ، يستخدم أمر تثبيت Pykaldi جميع المعالجات المتاحة (المنطقية) لتسريع عملية الإنشاء. إذا كان حجم ذاكرة النظام صغيرًا نسبيًا مقارنة بعدد المعالجات ، فقد ينتهي الأمر بتوصيلات التجميع/الارتباط المتوازي إلى مرفقة ذاكرة النظام وتؤدي إلى تبديل. يمكنك الحد من عدد الوظائف المتوازية المستخدمة لبناء بيكالدي على النحو التالي:
MAKE_NUM_JOBS=2 python setup.py installليس لدينا أي فكرة عما هو مطلوب لبناء بيكالدي على النوافذ. ربما يتطلب الأمر الكثير من التغييرات على نظام الإنشاء.
في الوقت الحالي ، لا يتوافق Pykaldi مع مستودع Kaldi في المنبع. تحتاج إلى بنائه ضد Kaldi Fork.
إذا كان لديك بالفعل تثبيت Kaldi متوافق على نظامك ، فلن تحتاج إلى تثبيت جهاز جديد داخل دليل pykaldi/tools . بدلاً من ذلك ، يمكنك ببساطة تعيين متغير البيئة التالي قبل تشغيل أمر تثبيت Pykaldi.
export KALDI_DIR= < directory where Kaldi is installed, e.g. " $HOME /tools/kaldi " >في الوقت الحالي ، لا يتوافق Pykaldi مع مستودع CLIF المنبع. تحتاج إلى بنائه باستخدام شوكة Clif.
إذا كان لديك بالفعل تثبيت CLIF متوافق على نظامك ، فلن تحتاج إلى تثبيت دليل جديد داخل دليل pykaldi/tools . بدلاً من ذلك ، يمكنك ببساطة تعيين متغيرات البيئة التالية قبل تشغيل أمر تثبيت Pykaldi.
export PYCLIF= < path to pyclif executable, e.g. " $HOME /anaconda3/envs/clif/bin/pyclif " >
export CLIF_MATCHER= < path to clif-matcher executable, e.g. " $HOME /anaconda3/envs/clif/clang/bin/clif-matcher " > على الرغم من أن الحاجة إلى تحديث Protobuf و CLIF يجب ألا تظهر في كثير من الأحيان ، فقد ترغب في أو تحتاج إلى تحديث تثبيت Kaldi المستخدم لبناء Pykaldi. إعادة تشغيل البرنامج النصي للتثبيت ذي الصلة في دليل tools يجب تحديث التثبيت الحالي. إذا لم ينجح هذا ، فيرجى فتح مشكلة.
تم تصميم حزمة Pykaldi tfrnnlm تلقائيًا مع بقية Pykaldi إذا تم العثور على مكتبة kaldi-tensorflow-rnnlm بين مكتبات Kaldi. بعد بناء Kaldi ، انتقل إلى KALDI_DIR/src/tfrnnlm/ directory واتبع التعليمات الواردة في makefile. تأكد من إضافة الرابط الرمزي لمكتبة kaldi-tensorflow-rnnlm إلى KALDI_DIR/src/lib/ Directory.
Shennong - صندوق أدوات لاستخراج ميزات الكلام ، مثل MFCC ، PLP وما إلى ذلك باستخدام Pykaldi.
Kaldi Model Server - خادم نموذج Kaldi الخيوط لفك التشفير المباشر. يمكن فك تشفير الكلام مباشرة من الميكروفون الخاص بك مع نموذج متوافق مع NNET3. نماذج مثال للغة الإنجليزية والألمانية متوفرة. يستخدم وحدة فك ترميز Pykaldi Online2.
MeetingBot-مثال على تطبيق ويب لتلبية النسخ والتلخيص الذي يستخدم خلفية Pykaldi/Kaldi-Model-Server لعرض إخراج ASR في المتصفح.
subtitle2go - توليد الترجمة التلقائي لأي ملف وسائط. يستخدم Pykaldi لـ ASR مع وحدة فك ترميز الدُفعات.
إذا كان لديك مشروع مفتوح المصدر رائع يستخدم Pykaldi الذي ترغب في عرضه هنا ، فأخبرنا!
إذا كنت تستخدم Pykaldi للبحث ، فيرجى الاستشهاد بالورقة على النحو التالي:
@inproceedings{pykaldi,
title = {PyKaldi: A Python Wrapper for Kaldi},
author = {Dogan Can and Victor R. Martinez and Pavlos Papadopoulos and
Shrikanth S. Narayanan},
booktitle={Acoustics, Speech and Signal Processing (ICASSP),
2018 IEEE International Conference on},
year = {2018},
organization = {IEEE}
}
نحن نقدر جميع المساهمات! إذا وجدت خطأ ، فلا تتردد في فتح مشكلة أو طلب سحب. إذا كنت ترغب في طلب أو إضافة ميزة جديدة ، فيرجى فتح مشكلة للمناقشة.