إخلاء المسؤولية: لا أعتبر أي خوارزميات وواجهات برمجة تطبيقات للعمل مع التعرف على الصوت والكلام. تتناول هذه المقالة مشكلات الصوت وكيفية حلها باستخدام Go.

phono
هو إطار عمل للعمل مع الصوت. وظيفتها الرئيسية هي إنشاء ناقل من مختلف التقنيات التي ستعالج الصوت لك بالطريقة التي تريدها.
ما علاقة الناقل به ، إلى جانب التقنيات المختلفة ، ولماذا إطار آخر؟ الآن دعونا نكتشف ذلك.
من أين يأتي الصوت؟
بحلول عام 2018 ، أصبح الصوت الطريقة القياسية التي يتفاعل بها البشر مع التكنولوجيا. قام معظم عمالقة تكنولوجيا المعلومات بإنشاء مساعد صوتي خاص بهم أو يقومون بذلك الآن. التحكم الصوتي موجود بالفعل في معظم أنظمة التشغيل ، والمراسلة الصوتية هي ميزة نموذجية لأي برنامج مراسلة. في العالم ، يعمل حوالي ألف شركة ناشئة على معالجة اللغة الطبيعية ونحو مائتي في التعرف على الكلام.
مع الموسيقى ، قصة مماثلة. يتم تشغيله من أي جهاز ، والتسجيل الصوتي متاح لكل من لديه جهاز كمبيوتر. تم تطوير البرامج الموسيقية من قبل مئات الشركات والآلاف من المتحمسين حول العالم.
إذا كان عليك العمل مع الصوت ، فيجب أن تبدو الشروط التالية مألوفة:
- يجب الحصول على الصوت من ملف أو جهاز أو شبكة ، إلخ.
- يجب معالجة الصوت: إضافة تأثيرات ، تحويل ، تحليل ، إلخ.
- يجب نقل الصوت إلى ملف أو جهاز أو شبكة ، إلخ.
- يتم إرسال البيانات في مخازن صغيرة.
اتضح خط أنابيب منتظم - هناك دفق بيانات يمر عبر عدة مراحل من المعالجة.
الحلول
للتوضيح ، لنأخذ مهمة من الحياة الحقيقية. على سبيل المثال ، تحتاج إلى تحويل صوت إلى نص:
- نسجل الصوت من الجهاز
- تخلص من الضوضاء
- معادلة
- مرر الإشارة إلى واجهة برمجة تطبيقات التعرف على الكلام
مثل أي مهمة أخرى ، هذا واحد لديه العديد من الحلول.
الجبين
المتشددين فقط راكبي الدراجات المبرمجين. نقوم بتسجيل الصوت مباشرة من خلال برنامج تشغيل بطاقة الصوت ، ونكتب تقليل الضوضاء الذكي والمعادل متعدد النطاقات. هذا مثير للاهتمام للغاية ، ولكن يمكنك نسيان مهمتك الأصلية لعدة أشهر.
طويل وصعب للغاية.
عادي
والبديل هو استخدام واجهات برمجة التطبيقات الحالية. يمكنك تسجيل الصوت باستخدام ASIO و CoreAudio و PortAudio و ALSA وغيرها. هناك أيضًا عدة أنواع من المكونات الإضافية للمعالجة: AAX و VST2 و VST3 و AU.
لا يعني الاختيار الواسع أنه يمكنك استخدام كل شيء في وقت واحد. عادةً ما يتم تطبيق القيود التالية:
- نظام تشغيل لا تتوفر جميع واجهات برمجة التطبيقات على جميع أنظمة التشغيل. على سبيل المثال ، AU هو تقنية OS X الأصلية وهو متاح فقط هناك.
- لغة البرمجة تتم كتابة معظم مكتبات الصوت بلغة C أو C ++. في عام 1996 ، أصدر Steinberg الإصدار الأول من VST SDK ، الذي لا يزال معيار البرنامج المساعد الأكثر شعبية. بعد 20 عامًا ، لم يعد من الضروري الكتابة في C / C ++: بالنسبة إلى VST ، توجد أغلفة في Java و Python و C # و Rust ومن يدري ماذا أيضًا. على الرغم من أن اللغة لا تزال مقيدة ، تتم معالجة الصوت حتى الآن في JavaScript.
- وظيفية. إذا كانت المهمة بسيطة ومباشرة ، فليس من الضروري كتابة طلب جديد. نفس FFmpeg يمكن أن تفعل الكثير.
في هذه الحالة ، يعتمد التعقيد على اختيارك. في أسوأ الحالات ، عليك التعامل مع العديد من المكتبات. وإذا لم تكن محظوظًا على الإطلاق ، مع تجريدات معقدة وواجهات مختلفة تمامًا.
ما هي النتيجة؟
عليك أن تختار بين معقدة للغاية ومعقدة :
- إما أن تتعامل مع العديد من واجهات برمجة التطبيقات منخفضة المستوى لكتابة دراجاتك
- إما أن تتعامل مع واجهات برمجة تطبيقات متعددة ومحاولة تكوين صداقات معهم
بغض النظر عن الطريقة التي يتم تحديدها ، فإن المهمة تنزل دائمًا إلى الناقل. قد تختلف التقنيات المستخدمة ، ولكن الجوهر هو نفسه. المشكلة هي أنه مرة أخرى ، بدلاً من حل مشكلة حقيقية ، عليك أن تكتب الدراجة الحزام الناقل.
ولكن هناك مخرج.
فونو

phono
إنشاء phono
لحل المشاكل الشائعة - " لتلقي ومعالجة ونقل " الصوت. للقيام بذلك ، يستخدم خط الأنابيب كأكثر التجريد الطبيعي. هناك مقال على مدونة Go الرسمية يصف نمط خط الأنابيب. الفكرة الرئيسية لخط الأنابيب هي أن هناك العديد من مراحل معالجة البيانات التي تعمل بشكل مستقل عن بعضها البعض وتبادل البيانات من خلال القنوات. ما تحتاجه.
لماذا تذهب؟
أولاً ، تتم كتابة معظم البرامج والمكتبات الصوتية بالحرف C ، وغالبًا ما يُشار إلى Go باسم خليفتها. بالإضافة إلى ذلك ، هناك cgo وعدد قليل من المجلدات للمكتبات الصوتية الموجودة. يمكنك أن تأخذ واستخدام.
ثانيًا ، في رأيي الشخصي ، Go هي لغة جيدة. لن أخوض في العمق ، لكني سألاحظ تعدد المواضيع . تبسط القنوات و gorutins بشكل كبير تنفيذ الناقل.
التجريد
قلب pipe.Pipe
هو نوع pipe.Pipe
. هو الذي ينفذ خط الأنابيب. كما هو الحال في العينة من المدونة ، هناك ثلاثة أنواع من المراحل:
pipe.Pump
(المضخة الإنجليزية) - استقبال الصوت ، قنوات الإخراج فقطpipe.Processor
(معالج اللغة الإنجليزية) - معالجة الصوت وقنوات الإدخال والإخراجpipe.Sink
(الحوض الإنجليزي) - انتقال الصوت ، قنوات الإدخال فقط
pipe.Pipe
يتم تمرير البيانات في المخازن المؤقتة. القواعد التي يتم من خلالها بناء خط أنابيب:

pipe.Pump
واحد- العديد من
pipe.Processor
يوضع pipe.Processor
بالتتابع واحدًا تلو الآخر pipe.Sink
واحد أو أكثر- جميع
pipe.Pipe
يجب أن تحتوي مكونات pipe.Pipe
على نفس:
- حجم المخزن المؤقت (الرسائل)
- معدل أخذ العينات
- عدد القنوات
الحد الأدنى للتكوين هو المضخة ومغسلة واحدة ، والباقي اختياري.
دعونا نلقي نظرة على بعض الأمثلة.
بسيط
المهمة: تشغيل ملف wav.
لنجلبها إلى النموذج " استلام ، معالجة ، تحويل ":
- احصل على الصوت من ملف wav
- انقل الصوت إلى جهاز portaudio

تتم قراءة الصوت وتشغيله على الفور.
كود package example import ( "github.com/dudk/phono" "github.com/dudk/phono/pipe" "github.com/dudk/phono/portaudio" "github.com/dudk/phono/wav" )
أولاً ، نقوم بإنشاء عناصر خط الأنابيب المستقبلي: wav.Pump
و portaudio.Sink
وتمريرها إلى pipe.New
. تبدأ وظيفة p.Do(pipe.actionFn) error
خط الأنابيب وتنتظر حتى تنتهي.
أصعب
المهمة: تقسيم ملف wav إلى عينات ، وتأليف مسار منها ، وحفظ النتيجة وتشغيلها في وقت واحد.
المسار هو سلسلة من العينات ، والعينة هي جزء صغير من الصوت. لقص الصوت ، يجب أولاً تحميله في الذاكرة. للقيام بذلك ، استخدم نوع phono/asset
. phono/asset
حزمة phono/asset
. نقسم المهمة إلى خطوات قياسية:
- احصل على الصوت من ملف wav
- انقل الصوت إلى الذاكرة
الآن نصنع عينات بأيدينا ، نضيفها إلى المسار وننهي المهمة:
- احصل على صوت من مسار
- نقل الصوت إلى

مرة أخرى ، بدون مرحلة المعالجة ، لكن خطين للأنابيب!
كود package example import ( "github.com/dudk/phono" "github.com/dudk/phono/asset" "github.com/dudk/phono/pipe" "github.com/dudk/phono/portaudio" "github.com/dudk/phono/track" "github.com/dudk/phono/wav" )
بالمقارنة مع المثال السابق ، هناك نوعان من pipe.Pipe
. الأول ينقل البيانات إلى الذاكرة بحيث يمكنك قص العينات. يحتوي الثاني على مستلمين في النهاية: wav.Sink
و portaudio.Sink
. مع هذا المخطط ، يتم تسجيل الصوت في وقت واحد في ملف wav وتشغيله.
أصعب
المهمة: قراءة ملفين wav ، خلط ، معالجة البرنامج المساعد vst2 وحفظه إلى ملف wav جديد.
يوجد mixer.Mixer
بسيط. phono/mixer
mixer.Mixer
phono/mixer
. يمكنه نقل الإشارات من عدة مصادر والحصول على واحد مختلط. للقيام بذلك ، تقوم في نفس الوقت بتنفيذ pipe.Pump
pipe.Sink
.
مرة أخرى ، تتكون المهمة من مهمتين فرعيتين. يبدو الأول مثل هذا:
- احصل على ملف wav الصوتي
- انقل الصوت إلى الخلاط
ثانيًا:
- احصل على صوت من الخلاط.
- معالجة البرنامج المساعد الصوتي
- نقل الصوت إلى ملف wav

كود package example import ( "github.com/dudk/phono" "github.com/dudk/phono/mixer" "github.com/dudk/phono/pipe" "github.com/dudk/phono/vst2" "github.com/dudk/phono/wav" vst2sdk "github.com/dudk/vst2" )
هناك بالفعل ثلاثة pipe.Pipe
، pipe.Pipe
خلال خلاط. للبدء ، استخدم p.Begin(pipe.actionFn) (pipe.State, error)
. على عكس p.Do(pipe.actionFn) error
، فإنه لا يمنع المكالمة ، ولكنه ببساطة يعيد حالة يمكن بعد ذلك انتظارها مع p.Wait(pipe.State) error
.
ما هي الخطوة التالية؟
أريد phono
يصبح phono
إطار التطبيق الأكثر ملاءمة. إذا كانت لديك مشكلة في الصوت ، فلن تحتاج إلى فهم واجهات برمجة التطبيقات المعقدة وقضاء الوقت في دراسة المعايير. كل ما هو مطلوب هو بناء ناقل من العناصر المناسبة وتشغيله.
تم تصوير الحزم التالية لمدة نصف عام:
phono/wav
- قراءة / كتابة ملفات WAVphono/vst2
- روابط غير مكتملة لـ VST2 SDK ، بينما يمكنك فقط فتح المكوّن الإضافي واستدعاء طرقه ، ولكن ليس كل الهياكلphono/mixer
- خلاط ، يضيف إشارات N ، بدون توازن وحجمphono/asset
- أخذ العينات العازلةphono/track
- القراءة التسلسلية للعينات (كسر الطبقات)phono/portaudio
- تشغيل الإشارة أثناء التجارب
بالإضافة إلى هذه القائمة ، هناك تراكم متزايد من الأفكار والأفكار الجديدة ، بما في ذلك:
- العد التنازلي
- متغير على خط الأنابيب ذبابة
- مضخة HTTP / بالوعة
- أتمتة المعلمات
- معالج إعادة التشكيل
- توازن وحجم الخلاط
- مضخة في الوقت الحقيقي
- مضخة متزامنة لمسارات متعددة
- vst2 الكامل
سأحلل في المقالات التالية:
- دورة حياة
pipe.Pipe
- بسبب البنية المعقدة ، يتم التحكم في حالتها بواسطة الذرة النهائية - كيفية كتابة مراحل خط الأنابيب الخاص بك
هذا هو أول مشروع مفتوح المصدر ، لذا سأكون ممتنًا لأية مساعدة وتوصيات. اهلا وسهلا.
المراجع