De obicei, există tentația de "reinventa roata" când se lucrează la un proiect. Poate e din cauza dorinței de a implementa o funcționalitate mai interesantă sau din cauza unei politici mai restrictive legate de utilizarea dependințelor externe care descurajează utilizarea acestora.
Când ar trebui ales un serviciu/ bibliotecă în locul unei implementări noi? Nu există un răspuns simplu și depinde de context, disponibilitatea acestor soluții externe, licențe, timp de dezvoltare și de altele.
Însă când discuția este despre soluții disponibile pentru problema transcrierii vocii în text (Speech-to-text), cred că este mult mai ușor de decis. Principalele motive sunt:
Conversia dintr-o limbă vorbită în text este o problemă complexă care necesită o investiție considerabilă de timp, cunoștințe, buget pentru o implementare de calitate.
Analiza soluțiilor Speech-to-text disponibile este realizată doar pentru soluțiile disponibile pentru aplicații Web (soluțiile desktop cum ar fi Dragon Professional nu sunt analizate) și pentru soluții care oferă posibilitatea transcrierii mai multor limbi (Rev nu este analizat deoarece oferă doar limba engleză).
Aplicațiile web sunt centrul acestei analize deoarece acest context de utilizare apare din ce în ce mai frecvent din cauza creșterii complexității soluțiilor web. Aceste aplicații pot simula sau înlocui acum funcționalități specifice (Speech-to-text în cazul curent) unui desktop și pot oferi mai multă valoare de business unui produs.
Deși partea de client web a avansat mult în ultimii ani, procesarea problemelor complexe (cum ar fi Speech-to-text) este realizată de cele mai multe ori de server.
Soluții
Luând în considerare decizia de a folosi o soluție externă pentru Speech-to-text, opțiunile disponibile pot fi împărțite în trei categorii:
Soluții Cloud (SaaS): aceste soluții oferă transcrierea ca un serviciu prin HTTP (sincron) sau prin WebSockets (asincron) (e.g. Google Cloud, Microsoft Azure, Amazon Transcribe, IBM Watson, Sonix);
Soluții On-Premise: aceste soluții oferă de multe ori doar componenta software (fără infrastructura aferentă), ceea ce va necesita găzduirea pe serverele proprii și crearea unei metode de comunicare cu aplicația web (e.g Mozilla STT, Vosk API, Google Cloud);
Tabelul de mai jos reprezintă unele dintre cele mai populare soluții cloud care oferă opțiuni de transcriere a vocii în text. Tabelul conține și câteva metrici relevante pentru fiecare soluție.
Din comparația de mai sus, au fost alese primele două opțiuni (pe baza raportului preț/ calitate) pentru o analiză legată de integrarea acestor servicii.
API-ul de la Google oferă opțiuni de autentificare limitate. De obicei, serviciile Google Cloud oferă posibilitatea autentificării prin trei modalități, însă pentru serviciul de Speech-to-text, doar două modalități sunt disponibile:
Disponibil: Google ID: fiecare utilizator final va folosi contul personal de Google pentru autentificarea în serviciu;
Disponibil: Service Level Authentication: folosind o schemă de autentificare de tip cheie publică/ cheie privată (necesită o implementare pe server);
Pentru cele mai multe cazuri, autentificarea individuală de către client nu este o soluție.
Acest lucru înseamnă că soluția de la Google necesită un wrapper în partea de server care să funcționeze ca un intermediar între aplicația web și serviciul de transcriere.
Alte detalii:
Oferă posibilități de comunicare sincronă folosind REST sau asincronă prin WebSockets;
Nu are disponibilă o bibliotecă de Javascript client-side (ceea ce are sens întrucât autentificarea de pe client side direct nu este posibilă), oferind, în schimb, o bibliotecă de Node.js;
Soluția oferită de Microsoft este similară în privința funcționalităților aduse cu cea de la Google. Diferența majoră este că oferă o acuratețe puțin mai scăzută la un preț mai bun.
Dispune de opțiuni multiple de autentificare, printre care și opțiunea care lipsește de la Google și anume:
Autentificarea pe bază de token este disponibilă (dar nu și recomandată, deoarece API key-ul ar fi expus); această opțiune face autentificarea posibilă direct din partea de client;
Alte detalii:
Oferă posibilități de comunicare sincronă folosind REST (maxim 60 secunde) sau asincronă prin WebSockets;
Oferă o bibliotecă de Javascript pentru partea de client;
Există și soluții on-premise disponibile, soluții care au avantaje/ dezavantaje:
Necesită un hardware mai puternic pentru o procesare rapidă;
Necesită o integrare mai complexă în partea de server;
Modelele de date trebuie antrenate manual;
Acuratețea transcrierii poate fi mai scăzută;
Cele două variante de soluții on-premise alese sunt doar o parte din opțiunile disponibile, dar sunt cele mai populare.
Se observă că acuratețea acestor soluții gratuite scade din cauza lipsei de 'antrenament' a algoritmilor din spate și necesită timp suplimentar pentru îmbunătățirea acestora.
Aceste soluții aduc o implementare nativă inclusă în anumite browsere web fiind în concordanță cu API-ul nativ Web Speech API.
Cu toate că această funcționalitate există în specificațiile oficiale, implementarea propriu-zisă se află în puține browsere așa cum apare în lista de compatibilitate.
În practică însă, singura soluție funcțională la momentul redactării acestui articol este cea din Chrome.
Soluția oferită de Chrome (și Chrome for Android) are câteva particularități specifice:
Ușor de integrat direct în partea de client;
Folosește în spate soluția de transcriere Google Cloud STT, ceea ce înseamnă rezultate foarte bune;
Necesită o conexiune permanentă la internet pentru a funcționa;
Procesarea propriu-zisă se face de serverele Google (ca și în cazul Google Cloud);
Există o serie de limitări cum ar fi (unele din ele neoficiale, dar validate în practică):
Maxim 50 requesturi de transcriere/ zi/ utilizator ;
Sesiunea maximă de transcriere este de 60 de secunde;
Termeni și condiții legate de gestiunea datelor;
Un exemplu de aplicație web care folosește cu succes acest tip de soluție este Dictation.io.
Pentru acest capitol este folosit ca exemplu următorul caz: un formular simplu, unde utilizatorul poate introduce informațiile atât folosind tastatura cât și dictând conținutul în engleză.
În exemplul de față am ales implementarea nativă din browserul Chrome datorită mai multor motive:
Funcționalitatea de transcriere necesară doar completează funcționalitatea existentă și nu e necesitate de bază (aceasta înseamnă utilizare sporadică);
Încadrarea în limitele de utilizare acordate de browser;
Soluția gratuită și rezultatele foarte bune;
Aplicația descrisă mai sus are următorul format:
Aplicația poate fi accesată și testată la adresa: https://ionut-iacob-kronsoft.github.io/stt-ng10-example/.
Aplicația descrisă mai sus a fost implementată într-un proiect nou de Angular 10. Componenta nouă care facilitează accesul la funcționalitatea de Speech-to-text este directiva speechToText.
Această directivă are rolul de a oferi o implementare generică și ușor de reutilizat pentru funcționalitatea de transcriere.
Aceasta funcționează în felul următor:
Poate fi adăugată pe orice element;
Directiva verifică dacă funcționalitatea de Speech-to-Text este disponibilă în browser;
Dacă este disponibilă, creează un element nou (iconița), care este atașat DOM-ului în mod dinamic (acea iconița are un listener pentru evenimentul de click asociat);
Se inițializează apoi callbackurile aferente utilizării API-ului Web Speech și se mapează pe structura internă (e.g. se reține valoarea textului transcris la fiecare pas);
Dacă transcrierea se termină cu succes, textul transcris este returnat de directivă sub formă de output;
Codul aplicației poate fi accesat la adresa: https://github.com/ionut-iacob-kronsoft/stt-ng10-example
Speech-to-text este o funcționalitate care a fost perfecționată mult în ultimii ani și sunt o mulțime de servicii disponibile care se pliază pentru orice context.
Suportul pentru aplicațiile Web este în continuă dezvoltare, iar variantele native (e.g. Google Chrome) oferă o modalitate foarte ușoară și gratuită de a integra Speech-to-text în orice aplicație.
API-ul nativ din browsere e o modalitate bună de a testa, valida, idea și a decide dacă o implementare mai complexă este necesară.