Barrymore, apa kabar di sekitar Voximplant? Soket web yang diterapkan, Pak


WebSocket adalah standar progresif untuk komunikasi dupleks-penuh (dua arah) antara klien dan layanan pihak ketiga secara real time. Soket web digunakan untuk mengatur pertukaran data berkelanjutan tanpa permintaan HTTP tambahan.

Dan kami dengan senang hati memberi tahu Anda bahwa semua ini menjadi mungkin berkat Voximplant berkat modul VoxEngine baru, yang disebut - kejutan - WebSocket . Mulai sekarang, Anda akan dapat mentransfer teks dan audio, memanfaatkan sepenuhnya soket web. Sederhananya, Anda memiliki alat lain untuk meningkatkan aplikasi Anda.

Dalam artikel ini, Anda akan belajar cara membuat koneksi WebSocket keluar, mentransfer aliran audio melalui itu, dan mengubahnya menjadi teks menggunakan Google Cloud Speech-to-Text API .
Harap dicatat bahwa Voximplant memiliki fungsionalitas bawaan untuk mengonversi ucapan ke teks secara real time di bawah kendali modul ASR . Modul ini menggunakan fungsi dari Google, Yandex dan Tinkoff, lihat detailnya di sini .

Artikel saat ini menjelaskan kasus ketika Anda ingin menggunakan layanan pihak ketiga untuk mengubah pidato menjadi teks dan / atau menghabiskan uang dari akunnya, dan bukan dari akun Voximplant.

Modul kami menyediakan dua format pekerjaan:
  • membuat koneksi keluar;
  • menerima koneksi yang masuk dan membuat soket web untuk itu.

Keluar


Hal pertama yang perlu Anda lakukan saat membuat koneksi keluar adalah menjalankan skrip VoxEngine. Kemudian panggil metode VoxEngine.createWebSocket , yang akan membuat objek WebSocket . Metode ini mengambil 2 parameter: URL dalam format 'wss: // + domain + path' dan protokol (opsional). Begini cara tampilannya dalam kode:

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

Jika semuanya berfungsi, metode call.sendMediaTo akan mengirimkan aliran audio ke soket, dan WebSocket.send , pada gilirannya, akan mengirim aliran audio yang didekodekan dalam format JSON melaluinya. Akibatnya, Anda akan menerima pesan dari layanan yang memproses permintaan.

Metode WebSocket.close diperlukan untuk menutup koneksi. Harap dicatat bahwa koneksi dapat ditutup baik di sisi klien dan di sisi server.

Kotak masuk


Untuk memungkinkan koneksi masuk, perlu melaporkan ini melalui VoxEngine.allowWebSocketConnections , serta berlangganan acara AppEvents.WebSocket . Maka akan mungkin untuk menerima koneksi yang masuk dan mendapatkan objek WebSocket: event.WebSocket. Lihat kode di bawah ini:

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

Untuk membuat soket web yang masuk, Anda memerlukan kontrol accessSecureURL. Itu bisa diambil dari acara AppEvents.Started atau respons terhadap permintaan HTTP yang memulai sesi. Perhatikan bahwa "https" harus diubah menjadi 'wss' di URL.

Langkah-langkah yang tersisa identik dengan yang disajikan dalam skema koneksi keluar.

Anda akan membutuhkannya


Untuk menerapkan teknologi WebSocket dan pengenalan suara ke dalam aplikasi Anda, Anda perlu:
  • Akun Voximplant. Jika Anda tidak memilikinya, silakan mendaftar di sini ;
  • Aplikasi Voximplant, serta skrip, aturan, dan satu pengguna. Semua ini akan dibuat dalam tutorial ini;
  • backend sederhana (kami akan memulai server pada node.js) dengan pustaka klien Cloud yang terhubung untuk API Bicara-ke-Teks;
  • klien web untuk melakukan panggilan (kami akan menggunakan telepon web di phone.voximplant.com ).

1. Pengaturan VOXIMPLANT


Untuk memulai, masuk ke akun Anda di manage.voximplant.com/auth . Di menu di sebelah kiri, klik "Aplikasi", buat yang baru dan beri nama websocket. Buka aplikasi Anda, beralih ke tab Skrip, buat skrip dan tempel kode berikut ke dalamnya:

 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); }); }); 

Skrip VoxEngine ini mengirimkan aliran audio ke WebSocket, dan juga melacak acara-acaranya (ERROR, CLOSE, OPEN, MESSAGE). Kita bisa menyelidiki detail skrip sedikit lebih lambat.

Sekarang, mari kita pergi ke tab "Routing", klik pada "Aturan Baru" dan menyebutnya socketRule. Sekarang tinggal memilih skrip Anda, dan membiarkan mask secara default (. *).


Hal terakhir yang perlu Anda lakukan pada tahap ini adalah membuat pengguna. Beralih ke tab "Pengguna", klik "Buat Pengguna", tentukan nama (misalnya, socketUser) dan kata sandi, lalu klik "Buat". Kami akan membutuhkan pasangan nama pengguna / kata sandi ini untuk otentikasi di klien web pada langkah terakhir.


Konfigurasi selesai, tetapi sebelum kita mulai membuat server, mari kita lihat bagaimana modul WebSocket bekerja dalam skenario kita.

2. Detail skrip


Modul WebSocket memungkinkan pengembang untuk membuka koneksi yang stabil dan mengirim data melalui itu. Untuk menggunakan modul ini, kita harus menghubungkannya di bagian paling awal dari skrip:

 require(Modules.WebSocket); 

Melalui metode createWebSocket, kami menentukan URL dan protokol (opsional). Anda dapat mempelajari cara mendapatkan URL untuk WebSocket dari bagian selanjutnya.

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

Setelah membuat objek WebSocket, kami terus mengelola panggilan di dalam handler. Yaitu, kami mengirim media ke objek WebSocket menggunakan metode call.sendMediaTo.

Di sini Anda dapat mengatur format penyandian yang disukai, tag dan beberapa parameter khusus. Jika Anda tidak mengatur encoding, PCM8 akan digunakan secara default.

Metode ini dipanggil ketika pesan koneksi yang berhasil diterima . Dalam skenario kami, kode panggilan terlihat seperti ini:

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

Semua peristiwa WebSocket lain yang Anda lihat dalam kode adalah untuk debugging, mereka mengirim informasi ke log sesi Voximplant. Anda dapat menghapusnya jika mau.

Akhirnya, kami menambahkan penangan penyelesaian penyelesaian transfer data yang benar. Dalam kasus kami, sesi Voximplant akan mengakhiri kerjanya 1 detik setelah panggilan berakhir ( terputus ):

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

Sekarang setelah logika skrip jelas, saatnya beralih ke bagian berikutnya yang sangat penting dari contoh kita.

3. Backend


Pertama, pastikan Node.js. diinstal di komputer Anda. Anda dapat mengunduhnya dari situs utama Node.js. Kemudian, jalankan perintah berikut di jendela terminal, satu demi satu, untuk mengatur lingkungan kerja:

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

Dan ketika ini selesai, buat file JS kosong dan tempatkan kode berikut di sana (nuansa kode akan disorot di bawah):

 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'); }); 

Sekarang server sudah dikonfigurasi, itu akan membantu kami melakukan pengenalan suara. Uji solusi Anda secara lokal dengan membuat terowongan di localhost 3000 menggunakan ngrok.

Untuk melakukan ini, ikuti langkah-langkah ini:
  1. Instal ngrok dengan mengikuti petunjuk di situs webnya .
  2. Tentukan authtoken Anda untuk ngrok untuk mengikat klien ke akun ini.
  3. Jalankan perintah node your_file_name.js untuk memulai server Anda di localhost: 3000.
  4. Buka folder ngrok di komputer Anda dan jalankan perintah ./ngrok http 3000 untuk membuat terowongan antara server lokal yang berjalan dan URL publik.

Perhatikan URL publik yang dihasilkan, kami menggunakannya sebagai URL WebSocket dengan awalan 'wss' dalam skrip:



4. Pengenalan ucapan


Anda mungkin memperhatikan bahwa kode backend kami berisi garis yang terkait dengan Google Cloud.

Perpustakaan itu sendiri diimpor sebagai berikut:

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

Sekarang Anda perlu menentukan cara memproses permintaan pengenalan ucapan. Untuk melakukan ini, pilih penyandian, sampleRateHertz dan languageCode di konfigurasi yang dibuat:

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

Selanjutnya, buat aliran tulis yang memungkinkan Anda menyimpan data yang ditransfer ke file:

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

Ketika semuanya sudah diatur, Anda perlu mem-parsing pesan dan meletakkan data audio dalam format base64 di Bukit pengakuan:

 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); } 

Segera setelah ini, permintaan pengakuan akan dimulai dan pemrosesan permintaan ini akan dimulai:

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

Terakhir, berikan kredensial akun layanan Anda untuk menghubungkan perpustakaan Google ke backendnya. Untuk melakukan ini, buka halaman otentikasi Google dan ikuti semua langkah yang tercantum di sana. Kemudian jalankan perintah ekspor di ruang kerja yang sama (di tab "Terminal" yang sama) sebagai node your_file_name.js:

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

Luncurkan soket


Buka phone.voximplant.com , isi formulir, dan klik Masuk. Nama pengguna dan kata sandi merujuk pada pengguna yang dibuat pada langkah 1:


Setelah otorisasi berhasil, klik Panggil dan mulai bicara. Awan Speech-to-Text akan mengubah pidato Anda menjadi teks secara real time, dan Anda dapat melihat teks ini di jendela terminal.

Anda berhasil, selamat! Kami harap Anda menyukai artikel ini dan berharap Anda mendapatkan lebih banyak integrasi dan tantangan baru.

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


All Articles