باريمور ، ما هو الطنانة حول Voximplant؟ مآخذ الويب المنفذة ، يا سيدي


يعد WebSocket معيارًا متطورًا لاتصال ثنائي الاتجاه (ثنائي الاتجاه) بين عميل وخدمة طرف ثالث في الوقت الفعلي. تستخدم مآخذ الويب لتنظيم تبادل البيانات المستمر دون طلبات HTTP إضافية.

ويسعدنا أن نعلمك أن كل هذا أصبح ممكنًا في Voximplant بفضل وحدة VoxEngine الجديدة ، والتي تسمى - surprise - WebSocket . من الآن فصاعدًا ، ستتمكن من نقل النص والصوت ، مع الاستفادة الكاملة من مآخذ الويب. ببساطة ، لديك أداة أخرى لترقية التطبيق الخاص بك.

في هذه المقالة ، ستتعرف على كيفية إنشاء اتصال WebSocket صادر ، ونقل دفق صوت من خلاله ، وتحويله إلى نص باستخدام واجهة برمجة تطبيقات Google Cloud Speech-to-Text .
يرجى ملاحظة أن Voximplant لديه وظيفة مدمجة لتحويل الكلام إلى نص في الوقت الحقيقي تحت سيطرة وحدة ASR . تستخدم هذه الوحدة وظائف من Google و Yandex و Tinkoff ، راجع التفاصيل هنا .

توضح المقالة الحالية الحالة عندما تريد استخدام خدمة تابعة لجهة خارجية لتحويل الكلام إلى نص و / أو إنفاق أموال من حسابه ، وليس من حساب Voximplant.

توفر الوحدة الخاصة بنا تنسيقين للعمل:
  • إنشاء اتصال للخارج
  • تلقي اتصال وارد وإنشاء مقبس ويب له.

الصادرة


أول شيء عليك القيام به عند إنشاء اتصال خارجي هو تشغيل البرنامج النصي VoxEngine. ثم اتصل بالطريقة VoxEngine.createWebSocket ، والتي ستقوم بإنشاء كائن WebSocket . تأخذ هذه الطريقة معلمتين: عنوان URL بالتنسيق "wss: // + domain + path" والبروتوكولات (اختياري). إليك كيف ستبدو في الكود:

VoxEngine.addEventListener(AppEvents.CallAlerting, function(e) { const webSocket = VoxEngine.createWebSocket( /*url*/ "wss://your_link/"); //       }); 

إذا كان كل شيء يعمل ، سترسل طريقة call.sendMediaTo دفق الصوت إلى المقبس ، وسيقوم WebSocket.send بدوره بإرسال دفق الصوت الذي تم فك ترميزه بتنسيق JSON من خلاله. نتيجة لذلك ، سوف تتلقى رسائل من الخدمة التي تعالج الطلبات.

مطلوب طريقة WebSocket.close لإغلاق الاتصال. يرجى ملاحظة أنه يمكن إغلاق الاتصال على جانب العميل وعلى جانب الخادم.

الوارد


للسماح بالاتصالات الواردة ، من الضروري الإبلاغ عن ذلك عبر VoxEngine.allowWebSocketConnections ، وكذلك الاشتراك في حدث AppEvents.WebSocket . بعد ذلك سيكون من الممكن قبول الاتصال الوارد والحصول على كائن WebSocket: event.WebSocket. انظر الكود أدناه:

 VoxEngine.allowWebSocketConnections(); VoxEngine.addEventListener(AppEvents.WebSocket, function(e) { //       }); 

لإنشاء مقبس ويب وارد ، فأنت بحاجة إلى عنصر تحكم accessSecureURL. يمكن أن تؤخذ من الحدث AppEvents.Started أو الاستجابة لطلب HTTP الذي بدأ الجلسة. لاحظ أنه يجب تغيير "https" إلى "wss" في عنوان URL.

الخطوات المتبقية مماثلة لتلك المقدمة في نظام الاتصال الصادر.

سوف تحتاج


لتطبيق تقنية WebSocket والتعرف على الكلام في تطبيقك ، ستحتاج إلى:
  • حساب Voximplant. إذا لم يكن لديك ، فلا تتردد في التسجيل هنا ؛
  • تطبيق Voximplant ، بالإضافة إلى برنامج نصي وقاعدة ومستخدم واحد. سيتم إنشاء كل هذا في هذا البرنامج التعليمي.
  • الواجهة الخلفية البسيطة (سنبدأ تشغيل الخادم على node.js) مع مكتبة عميل Cloud المتصلة بـ Speech-to-Text API ؛
  • عميل الويب لإجراء مكالمة (سوف نستخدم هاتف الويب على phone.voximplant.com ).

1. إعدادات VOXIMPLANT


للبدء ، قم بتسجيل الدخول إلى حسابك على manager.voximplant.com/auth . في القائمة الموجودة على اليسار ، انقر فوق "Applications" ، وقم بإنشاء واحدة جديدة وقم بتسميتها websocket. انتقل إلى التطبيق الخاص بك ، قم بالتبديل إلى علامة التبويب "البرامج النصية" ، قم بإنشاء برنامج نصي ولصق التعليمة البرمجية التالية فيه:

 require(Modules.WebSocket); VoxEngine.addEventListener(AppEvents.CallAlerting, function(e) { call = e.call; call.answer(); const webSocket = VoxEngine.createWebSocket( /*url*/ "wss://your_ngrok_link/"); webSocket.addEventListener(WebSocketEvents.ERROR, function(e) { Logger.write("LOG OUTGOING: WebSocketEvents.ERROR"); call.sendMessage("LOG OUTGOING: WebSocketEvents.ERROR"); }); webSocket.addEventListener(WebSocketEvents.CLOSE, function(e) { Logger.write("LOG OUTGOING: WebSocketEvents.CLOSE: " + e.reason); call.sendMessage("LOG OUTGOING: WebSocketEvents.CLOSE: " + e.reason); }); webSocket.addEventListener(WebSocketEvents.OPEN, function(e) { Logger.write("LOG OUTGOING: WebSocketEvents.OPEN"); Logger.write(JSON.stringify(e)) call.sendMessage("LOG OUTGOING: WebSocketEvents.OPEN"); }); webSocket.addEventListener(WebSocketEvents.MESSAGE, function(e) { Logger.write("LOG OUTGOING: WebSocketEvents.MESSAGE: " + e.text); call.sendMessage("LOG OUTGOING: WebSocketEvents.MESSAGE: " + e.text); if (e.text == "Hi there, I am a WebSocket server") { call.sendMediaTo(webSocket, { encoding: WebSocketAudioEncoding.ULAW, "tag": "MyAudioStream", "customParameters": { "param1": "12345" } }); } }); call.addEventListener(CallEvents.Disconnected, function(e) { Logger.write("LOG OUTGOING: terminating in 1 sec"); webSocket.close(); setTimeout(VoxEngine.terminate, 1000); }); }); 

يرسل برنامج VoxEngine هذا دفقًا صوتيًا إلى WebSocket ، ويتتبع أيضًا أحداثه (خطأ ، CLOSE ، OPEN ، MESSAGE). يمكننا الخوض في تفاصيل البرنامج النصي في وقت لاحق.

الآن ، دعنا نذهب إلى علامة التبويب "التوجيه" ، انقر فوق "قاعدة جديدة" ونسميها socketRule. يبقى الآن فقط تحديد البرنامج النصي الخاص بك ، وترك القناع افتراضيًا (. *).


آخر ما عليك القيام به في هذه المرحلة هو إنشاء مستخدم. قم بالتبديل إلى علامة التبويب "المستخدمون" ، وانقر فوق "إنشاء مستخدم" ، وحدد اسمًا (على سبيل المثال ، socketUser) وكلمة المرور ، ثم انقر فوق "إنشاء". سنحتاج إلى زوج اسم المستخدم / كلمة المرور للمصادقة في عميل الويب في الخطوة الأخيرة.


اكتمل التكوين ، ولكن قبل أن نبدأ في إنشاء الخادم ، دعونا نلقي نظرة على كيفية عمل وحدة WebSocket في السيناريو الخاص بنا.

2. تفاصيل البرنامج النصي


تسمح وحدة WebSocket للمطورين بفتح اتصال ثابت وإرسال البيانات من خلاله. لاستخدام هذه الوحدة ، يجب أن نقوم بتوصيلها في بداية البرنامج النصي:

 require(Modules.WebSocket); 

من خلال طريقة createWebSocket ، نحدد عنوان URL والبروتوكولات (اختياري). يمكنك معرفة كيفية الحصول على URL الخاص بـ WebSocket من القسم التالي.

 const webSocket = VoxEngine.createWebSocket( /*url*/ "wss://your_ngrok_link/"); 

بعد إنشاء كائن WebSocket ، نواصل إدارة المكالمة داخل المعالج. وهي نرسل الوسائط إلى كائن WebSocket باستخدام طريقة call.sendMediaTo.

يمكنك هنا تعيين تنسيق الترميز المفضل والعلامة وبعض المعلمات المخصصة. إذا لم تقم بتعيين التشفير ، فسيتم استخدام PCM8 افتراضيًا.

تسمى هذه الطريقة عند تلقي رسالة اتصال ناجحة. في السيناريو الخاص بنا ، يبدو رمز الاتصال كما يلي:

 call.sendMediaTo(webSocket, { encoding: WebSocketAudioEncoding.ULAW, "tag": "MyAudioStream", "customParameters": { "param1": "12345" } }); 

جميع أحداث WebSocket الأخرى التي تراها في التعليمات البرمجية مخصصة للتصحيح ؛ فهي ترسل معلومات إلى سجل جلسة Voximplant. يمكنك إزالتها إذا كنت تريد.

أخيرًا ، نضيف معالج إكمال نقل البيانات الصحيح. في حالتنا ، تنهي جلسة Voximplant عملها ثانية واحدة بعد انتهاء المكالمة المحددة (تم قطع الاتصال ):

 call.addEventListener(CallEvents.Disconnected, function(e) { Logger.write("LOG OUTGOING: terminating in 1 sec"); webSocket.close(); setTimeout(VoxEngine.terminate, 1000); }); 

الآن وقد أصبح منطق البرنامج النصي واضحًا ، فقد حان الوقت للانتقال إلى الجزء التالي الهام للغاية من مثالنا.

3. الخلفية


أولاً ، تأكد من تثبيت Node.js. على جهاز الكمبيوتر الخاص بك. يمكنك تنزيله من الموقع الرئيسي Node.js. بعد ذلك ، قم بتشغيل الأوامر التالية في إطار المحطة الطرفية ، واحدة تلو الأخرى ، لإعداد بيئة العمل:

 npm install express npm install ws npm install @google-cloud/speech 

وعندما يتم ذلك ، قم بإنشاء ملف JS فارغ ووضع الكود التالي هناك (سيتم تمييز الفروق الدقيقة في الكود أدناه):

 const app = require('express')(); const http = require('http').createServer(app); const WebSocket = require('ws'); const fs = require('fs'); const wss = new WebSocket.Server({ server: http }); //     Google Cloud const speech = require('@google-cloud/speech'); //    const client = new speech.SpeechClient(); const config = { encoding: 'MULAW', sampleRateHertz: 8000, languageCode: 'ru-RU', }; const request = { config, interimResults: true, }; let audioInput = []; let recognizeStream = null; process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; app.get('/', function(req, res) { res.send('<h1>Hello world</h1>'); }); wss.on('connection', (ws) => { //  ,       var wstream = fs.createWriteStream('myBinaryFile'); //   audioInput audioInput = []; //    recognizeStream = client .streamingRecognize(request) .on('error', err => { ws.close(); }) .on('data', data => { ws.send(data.results[0].alternatives[0].transcript) process.stdout.write( data.results[0] && data.results[0].alternatives[0] ? `Transcription: ${data.results[0].alternatives[0].transcript}\n` : `\n\nError occurred, press Ctrl+C\n` ) }); ws.on('close', (message) => { console.log('The time limit for speech recognition has been reached. Please disconnect and call again.'); wstream.end(); }) //  ,     message ws.on('message', (message) => { //     base64  recognizeStream try { let data = JSON.parse(message) if (data.event == "media") { let b64data = data.media.payload; let buff = new Buffer.from(b64data, 'base64'); recognizeStream.write(buff); wstream.write(buff); } } catch (err) { console.log(message) } }); //      ws.send('Hi there, I am a WebSocket server'); }); http.listen(3000, function() { console.log('listening on *:3000'); }); 

الآن بعد تكوين الخادم ، سيساعدنا ذلك في التعرف على الكلام. اختبر الحل الخاص بك محليًا عن طريق إنشاء نفق على المضيف المحلي 3000 باستخدام ngrok.

للقيام بذلك ، اتبع الخطوات التالية:
  1. قم بتثبيت ngrok باتباع الإرشادات الموجودة على موقع الويب الخاص بها .
  2. حدد authtoken الخاص بك ل ngrok لربط العميل بهذا الحساب.
  3. قم بتشغيل node your_file_name.js لبدء تشغيل الخادم على المضيف node your_file_name.js : 3000.
  4. انتقل إلى مجلد ngrok على جهاز الكمبيوتر الخاص بك وقم بتشغيل الأمر ./ngrok http 3000 لإنشاء نفق بين الخادم المحلي الجاري تشغيله وعنوان URL العام.

انتبه إلى عنوان URL العام الذي تم إنشاؤه ، ونحن نستخدمه كعنوان URL WebSocket مع البادئة "wss" في البرنامج النصي:



4. التعرف على الكلام


ربما لاحظت أن شفرة الواجهة الخلفية لدينا تحتوي على أسطر مرتبطة بـ Google Cloud.

يتم استيراد المكتبة نفسها على النحو التالي:

 const speech = require('@google-cloud/speech'); 

تحتاج الآن إلى تحديد كيفية معالجة طلب التعرف على الكلام. للقيام بذلك ، حدد الترميز ، sampleRateHertz و languageCode في التكوين الذي تم إنشاؤه:

 const config = { encoding: 'MULAW', sampleRateHertz: 8000, languageCode: 'en-US', }; 

بعد ذلك ، قم بإنشاء دفق للكتابة يسمح لك بحفظ البيانات المنقولة إلى ملف:

 var wstream = fs.createWriteStream('myBinaryFile'); 

عندما يتم إعداد كل شيء ، تحتاج إلى تحليل الرسالة ووضع بيانات الصوت بتنسيق base64 في RecognStream:

 let data = JSON.parse(message) if (data.event == "media") { b64data = data.media.payload; let buff = new Buffer.from(b64data, 'base64'); recognizeStream.write(buff); wstream.write(buff); } 

بعد هذا مباشرة ، سيتم بدء طلب الاعتراف وستبدأ معالجة هذا الطلب:

 recognizeStream = client .streamingRecognize(request) .on('data', data => { ws.send(data.results[0].alternatives[0].transcript) }); 

أخيرًا ، قدم بيانات اعتماد حساب الخدمة الخاص بك لتوصيل مكتبة Google بالجهة الخلفية الخاصة بها. للقيام بذلك ، انتقل إلى صفحة مصادقة Google واتبع جميع الخطوات المذكورة هناك. ثم قم بتشغيل أمر التصدير في نفس مساحة العمل (في نفس علامة التبويب "المحطة الطرفية") node your_file_name.js:

 export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/[FILE_NAME].json" 

إطلاق مآخذ


افتح phone.voximplant.com ، املأ النموذج ، وانقر فوق تسجيل الدخول. اسم المستخدم وكلمة المرور تشير إلى المستخدم الذي تم إنشاؤه في الخطوة 1:


بعد التفويض الناجح ، انقر فوق اتصال وابدأ الحديث. ستحول سحابة الكلام إلى نص كلامك إلى نص في الوقت الفعلي ، ويمكنك رؤية هذا النص في نافذة المحطة الطرفية.

لقد فعلت ذلك ، تهانينا! نأمل أن تكون قد أعجبك المقال ونتمنى لك مزيدًا من التكامل والتحديات الجديدة.

Source: https://habr.com/ru/post/ar476902/


All Articles