Folosind API-ul de recunoaștere a vorbirii în iOS 10

Ce veți crea

Introducere

Siri a fost o caracteristică de bază a iOS, deoarece a fost introdusă în 2011. Acum, iOS 10 aduce noi caracteristici care să permită dezvoltatorilor să interacționeze cu Siri. În special, sunt disponibile două noi cadre: Speech și SiriKit. 

Astăzi, vom analiza cadrul de vorbire, care ne permite să traducem cu ușurință audio în text. Veți învăța cum să construiți o aplicație din viața reală care utilizează API-ul de recunoaștere a vorbirii pentru a verifica starea unui zbor.

Dacă doriți să aflați mai multe despre SiriKit, l-am acoperit în Extensiile Creați SiriKit în iOS 10 tutorial. Pentru mai multe detalii despre noile caracteristici noi pentru dezvoltatorii din iOS 10, verificați cursul lui Markus Mühlberger, chiar aici pe Envato Tuts+.

folosire

Recunoașterea vorbelor este procesul de traducere a sunetului live sau preînregistrat în textul transcris. Întrucât Siri a fost introdus în iOS 5, în tastatura sistemului a existat un buton pentru microfon care permite utilizatorilor să dicteze cu ușurință. Această caracteristică poate fi utilizată cu orice intrare de text UIKit și nu necesită să scrieți cod suplimentar dincolo de ceea ce ați scrie pentru a sprijini o intrare standard de text. Este foarte rapid și ușor de folosit, dar vine cu câteva limitări:

  • Tastatura este întotdeauna prezentă când dictăm.
  • Limba nu poate fi personalizată de aplicația în sine.
  • Aplicația nu poate fi anunțată atunci când dictarea începe și termină.

Pentru a permite dezvoltatorilor să construiască aplicații mai personalizabile și mai puternice, cu aceeași tehnologie de dictare ca Siri, Apple a creat cadrul de vorbire. Permite fiecărui dispozitiv care rulează iOS 10 să traducă audio în text în peste 50 de limbi și dialecte.

Acest nou API este mult mai puternic, deoarece nu oferă doar un serviciu simplu de transcriere, ci oferă, de asemenea, interpretări alternative despre ceea ce ar fi spus utilizatorul. Puteți controla când să opriți o dictare, puteți afișa rezultatele pe măsură ce utilizatorul vorbește, iar motorul de recunoaștere a vorbirii se va adapta automat la preferințele utilizatorului (limbă, vocabular, nume etc.). 

O caracteristică interesantă este suportul pentru transcrierea audio preînregistrată. Dacă construiți o aplicație de mesagerie instantanee, de exemplu, puteți utiliza această funcție pentru a transcrie textul mesajelor audio noi.

Înființat

În primul rând, va trebui să întrebați utilizatorul pentru permisiunea de a transmite vocea la Apple pentru analiză. 

În funcție de dispozitiv și limba care urmează să fie recunoscută, iOS poate decide în mod transparent să transcrie audio pe dispozitivul însuși sau, dacă recunoașterea vocală locală nu este disponibilă pe dispozitiv, iOS va folosi serverele Apple pentru a face lucrarea. 

De aceea, de obicei, este necesară o conexiune activă la internet pentru recunoașterea vorbirii. Vă voi arăta cum să verificați foarte curând disponibilitatea serviciului.

Există trei pași pentru a utiliza recunoașterea vorbirii:

  • Explicați: spuneți-le utilizatorului de ce doriți să accesați vocea lor.
  • Autorizați: solicitați explicit autorizarea pentru a accesa vocea lor.
  • Solicitare: încărcați un audio preînregistrat din disc folosind SFSpeechURLRecognitionRequest, sau streaming audio folosind SFSpeechAudioBufferRecognitionRequest și procesează transcripția.

Dacă doriți să aflați mai multe despre cadrul Speech, vizionați WWDC 2016 Session 509. De asemenea, puteți citi documentația oficială.

Exemplu

Vă voi arăta acum cum să construiți o aplicație reală care să profite de API-ul de recunoaștere a vorbirii. Vom construi o aplicație mică de urmărire a zborului în care utilizatorul poate să spună pur și simplu un număr de zbor, iar aplicația va afișa starea actuală a zborului. Da, vom construi un mic asistent ca Siri pentru a verifica starea oricărui zbor!

În replica GitHub a tutorialului, am furnizat un proiect de schelet care conține un interfață de bază care ne va ajuta pentru acest tutorial. Descărcați și deschideți proiectul în Xcode 8.2 sau o versiune ulterioară. Începând cu un interfață utilizator existent, ne vom concentra asupra API-ului de recunoaștere a vorbirii.

Uitați-vă la clasele din proiect. UIViewController + Style.swift conține majoritatea codului responsabil pentru actualizarea interfeței utile. Exemplul de date dat al zborurilor afișate în tabel este declarat în FlightsDataSource.swift.

Dacă executați proiectul, acesta ar trebui să arate după cum urmează.

După ce utilizatorul apasă butonul microfonului, dorim să pornim recunoașterea vocală pentru a transcrie numărul de zbor. Deci, dacă utilizatorul spune "LX40", dorim să arătăm informațiile referitoare la poarta și starea actuală a zborului. Pentru a face acest lucru, vom apela o funcție care să caute automat zborul într-o sursă de date și să arate starea zborului. 

Mai întâi vom explora modul în care să transcriem din audio preînregistrat. Mai târziu, vom învăța cum să implementăm recunoașterea vocală mai interesantă.

Să începem prin stabilirea proiectului. Deschide Info.plist fișier și adăugați un nou rând cu explicația care va fi afișată utilizatorului atunci când vi se solicită permisiunea de a accesa vocea acestuia. Rândul nou adăugat este evidențiat în albastru în imaginea următoare.

Odată ce acest lucru este făcut, deschideți ViewController.swift. Nu vă supărați codul care se află deja în această clasă; se ocupă doar de actualizarea interfeței UI pentru noi.

Primul pas cu orice cadru nou pe care doriți să-l utilizați este importul acestuia în partea de sus a fișierului.

importă vorbire

Pentru a afișa dialogul de permisiune utilizatorului, adăugați acest cod în viewDidLoad (animat :) metodă:

comutare SFSpeechRecognizer.authorizationStatus () cazul .deDetermined: askSpeechPermission () caz .autorizat: self.status = .prioritate .denied, .restricted: self.status = .unavailable

 stare variabila are grijă de schimbarea interfeței utilizator pentru a avertiza utilizatorul că recunoașterea vorbirii nu este disponibilă în cazul în care ceva nu merge bine. Vom atribuia o nouă stare aceleiași variabile de fiecare dată când dorim să schimbăm interfața utilizator.

Dacă aplicația nu a cerut încă permisiunea utilizatorului, statutul de autorizare va fi nedeterminat, și noi numim askSpeechPermission metoda de ao cere așa cum este definită în pasul următor.

Tu ar trebui întotdeauna eșuează grațios dacă nu este disponibilă o caracteristică specifică. Este, de asemenea, foarte important să fie mereu comunicați utilizatorului atunci când vă înregistrați vocea. Nu încercați niciodată să recunoașteți vocea fără să actualizați mai întâi interfața utilizator și să-i informați pe utilizator.

Iată implementarea funcției de a solicita permisiunea utilizatorului.

func askSpeechPermission () SFSpeechRecognizer.requestAuthorization status în OperationQueue.main.addOperation comutare status caz .autorizat: self.status = .devară default: self.status = .unavailable

Invocăm requestAuthorization pentru a afișa cererea de recunoaștere a recunoașterii vocale pe care am adăugat-o la Info.plist. Apoi trecem la firul principal în cazul în care închiderea a fost invocată pe un fir diferit - vrem să actualizăm interfața de utilizator numai din firul principal. Atribuiți noul stare pentru a actualiza butonul microfonului pentru a semnala utilizatorilor disponibilitatea (sau nu) a recunoașterii vocale.

Recunoaștere audio pre-înregistrată

Înainte de a scrie codul pentru a recunoaște sunetul preînregistrat, trebuie să găsim adresa URL a fișierului audio. În navigatorul de proiect, verificați dacă aveți un fișier numit LX40.m4a. Am înregistrat acest dosar cu aplicația Voice Memos de pe iPhone, spunând "LX40". Putem verifica cu ușurință dacă obținem o transcriere corectă a sunetului.

Stocați adresa URL a fișierului audio într-o proprietate:

var preRecordedAudioURL: URL = înapoi Bundle.main.url (pentruResurse: "LX40", cu Extensie: "m4a")!  ()

Este timpul să vedem în cele din urmă puterea și simplitatea cadrului de vorbire. Acesta este codul care ne recunoaște toată vorbirea:

funcția recunoaștereFile (url: URL) guard let recognizer = SFSpeechRecognizer (), recognizer.isDisponibil altceva return permite solicitarea = SFSpeechURLRecognitionRequest (url: url) recognizer.recognitionTask (cu: request) result, recognizer = SFSpeechRecognizer (), recognizer.isDisponibil altceva return self.status = .unavailable dacă let rezultat = rezultat self.flightTextView.text = result.bestTranscription.formattedString dacă result.isFinal self.searchFlight (number: result.bestTranscription.formattedString)  altceva dacă permiteți eroare = eroare print (eroare)

Iată ce face această metodă:

  • Inițializați o SFSpeechRecognizer și verificați dacă recunoașterea vorbirii este disponibilă cu o declarație de pază. Dacă nu este disponibil, pur și simplu setați statusul la indisponibil și întoarcere. (Initializatorul implicit utilizează localul de utilizator implicit, dar puteți utiliza și SFSpeechRecognizer (locale :) inițializator pentru a oferi o locație diferită.)
  • Dacă este disponibilă recunoașterea vorbirii, creați o SFSpeechURLRecognitionRequest exemplu prin trecerea adresei URL audio preînregistrate.
  • Porniți recunoașterea vocală invocând recognitionTask (cu :) cu cererea creată anterior.

Închiderea va fi apelată de mai multe ori cu doi parametri: un rezultat și un obiect de eroare. 

 Recognizer este de fapt redarea fișierului și încercarea de a recunoaște incremental textul. Din acest motiv, închiderea se numește de mai multe ori. De fiecare dată când recunoaște o literă sau un cuvânt sau face unele corecții, închiderea este invocată cu obiecte actualizate. 

 rezultat obiect are isFinal proprietate setat la true când fișierul audio a fost complet analizat. În acest caz, începem o căutare în sursa de date de zbor pentru a vedea dacă găsim un zbor cu numărul de zbor recunoscut. searchFlight funcția va avea grijă să afișeze rezultatul.

Ultimul lucru pe care îl lipsește este să invocăm recognizeFile (URL :) când butonul pentru microfon este apăsat:

@IBAction func microphonePrimat (_ expeditor: Oricare) recognizeFile (url: preRecordedAudioURL)

Rulați aplicația de pe dispozitivul dvs. care rulează iOS 10, apăsați butonul microfonului și veți vedea rezultatul. Sunetul "LX40" este recunoscut treptat, iar starea zborului este afișată!

 

Indicație: Numărul de zbor este afișat într-un mesaj UITextView. După cum probabil ați observat, dacă activați detectorul de date privind numărul de zbor din UITextView, îl puteți apăsa și starea curentă a zborului va fi efectiv afișată!

Codul complet de exemple până la acest punct poate fi văzut în ramura audio pre-înregistrată în GitHub.

Recunoaștere audio live

Să vedem acum cum să implementăm recunoașterea vocală în direct. Va fi un pic mai complicat în comparație cu ceea ce am făcut. Puteți descărca din nou același proiect de schelet și urmați-l.

Avem nevoie de o cheie nouă în Info.plist fișier pentru a explica utilizatorului de ce avem nevoie de acces la microfon. Adăugați un rând nou la dvs. Info.plist așa cum se arată în imagine.

Nu este necesar să solicităm manual permisiunea utilizatorului, deoarece iOS va face asta pentru noi de îndată ce vom încerca să accesăm orice API-uri legate de microfon.

Putem reutiliza același cod pe care l-am folosit în secțiunea anterioară (amintiți-vă importă vorbire) să solicite autorizația. viewDidLoad (animat :) metoda este implementată exact ca înainte:

comutare SFSpeechRecognizer.authorizationStatus () cazul .deDetermined: askSpeechPermission () caz .autorizat: self.status = .prioritate .denied, .restricted: self.status = .unavailable

De asemenea, metoda de a cere utilizatorului permisiunea este aceeași.

func askSpeechPermission () SFSpeechRecognizer.requestAuthorization status în OperationQueue.main.addOperation comutare status caz .autorizat: self.status = .devară default: self.status = .unavailable

Implementarea sistemului începe înregistrarea va fi un pic diferit. Să adăugăm mai întâi câteva variabile de instanță noi care vor fi utile în timp ce gestionați sesiunea audio și sarcina de recunoaștere a vorbirii.

permiteți audioEngine = AVAudioEngine () să lase speechRecognizer: SFSpeechRecognizer? = SFSpeechRecognizer () lasa cererea = SFSpeechAudioBufferRecognitionRequest () var recognitionTask: SFSpeechRecognitionTask?

Să aruncăm o privire la fiecare variabilă separat:

  • AVAudioEngine este folosit pentru a procesa un flux audio. Vom crea un nod audio și îl vom atașa la acest motor, astfel încât să putem fi actualizați când microfonul recepționează semnale audio.
  • SFSpeechRecognizer este aceeași clasă pe care am văzut-o în partea anterioară a tutorialului și are grijă să recunoască discursul. Având în vedere că inițializatorul poate eșua și nu poate reveni, declarăm că este opțional pentru a evita crashing la timpul de execuție.
  • SFSpeechAudioBufferRecognitionRequest este un tampon folosit pentru a recunoaște discursul live. Dat fiind că nu avem fișierul audio complet așa cum am făcut înainte, avem nevoie de un tampon pentru a aloca discursul în timp ce utilizatorul vorbește.
  • SFSpeechRecognitionTask gestionează sarcina curentă de recunoaștere a vorbirii și poate fi utilizată pentru oprirea sau anularea acesteia.

Odată ce am declarat toate variabilele necesare, să implementăm începe înregistrarea.

func startRecording () // Instalarea motorului audio și a dispozitivului de recunoaștere a vorbitorului de voce let node = audioEngine.inputNode altceva return permite înregistrareaFormat = node.outputFormat (pentruBus: 0) node.installTap (onBus: 0, bufferSize: 1024, format: recordingFormat ) buffer, _ în self.request.append (tampon) // Pregătiți și începeți să înregistrați audioEngine.prepare () do try audioEngine.start () self.status = .recognizing / Analiza discursului de recunoaștereTask = speechRecognizer? .RecognitionTask (cu: request, resultHandler: rezultat, eroare în dacă rezultatul = rezultat self.flightTextView.text = result.bestTranscription.formattedString self.searchFlight (număr: result.bestTranscription.formattedString  altceva dacă permiteți eroare = eroare print (eroare)

Acesta este codul principal al funcției noastre. O voi explica pas cu pas:

  • Mai întâi primim inputNode din audioEngine. Un dispozitiv poate avea mai multe intrări audio, iar aici selectăm primul.
  • Spunem nodului de intrare că dorim să monitorizăm fluxul audio. Blocul pe care îl furnizăm va fi invocat la fiecare flux audio primit de 1024 octeți. Aplicăm imediat bufferul audio la cerere astfel încât să poată începe procesul de recunoaștere.
  • Pregătim motorul audio pentru a începe înregistrarea. Dacă înregistrarea începe cu succes, setați starea la .recunoscând astfel încât actualizăm pictograma buton pentru a permite utilizatorului să știe că vocea lor este înregistrată.
  • Să atribuim obiectul returnat de la speechRecognizer.recognitionTask (cu: resultHandler :) la recognitionTask variabil. Dacă recunoașterea are succes, căutăm zborul în sursa de date și actualizăm interfața utilizator. 

Funcția de anulare a înregistrării este la fel de simplă ca oprirea motorului audio, scoaterea robinetului de la nodul de intrare și anularea sarcinii de recunoaștere.

func cancelRecord () audioEngine.stop () dacă permite node = audioEngine.inputNode node.removeTap (onBus: 0) recognitionTask? .cancel ()

Acum trebuie doar să începem și să oprim înregistrarea. Modificați microphonePressed după cum urmează:

@IBAction func microphonePrimat () starea comutatorului caz .ready: startRecording () status = .recunoaștere caz .recognizing: cancelRecording () status = .ready default: break

În funcție de curent stare, începem sau oprim recunoașterea vorbirii.

Construiți și rulați aplicația pentru a vedea rezultatul. Încercați să scrieți oricare dintre numerele de zboruri afișate și ar trebui să vedeți cum apare situația.

 

Încă o dată, exemplul de cod poate fi văzut în suita audio live pe GitHub.

Cele mai bune practici

Recunoașterea vorbelor este un API foarte puternic pe care Apple la oferit dezvoltatorilor iOS care vizează iOS 10. Este complet gratuit pentru utilizare, dar rețineți că nu este nelimitat în utilizare. Este limitat la aproximativ un minut pentru fiecare sarcină de recunoaștere a vorbirii, iar aplicația dvs. poate fi de asemenea afectată de serverele Apple dacă necesită prea multă calcul. Din aceste motive, are un impact mare asupra traficului în rețea și a consumului de energie. 

Asigurați-vă că utilizatorii dvs. sunt instruiți în mod corespunzător cu privire la modul de utilizare a recunoașterii vocale și să fie la fel de transparenți cu cât înregistrați vocea lor. 

Recapitulare

În acest tutorial ați văzut cum să utilizați recunoașterea rapidă, precisă și flexibilă a vorbirii în iOS 10. Utilizați-o în propriul dvs. avantaj pentru a oferi utilizatorilor dvs. un nou mod de a interacționa cu aplicația dvs. și a îmbunătăți accesibilitatea acesteia în același timp. 

Dacă doriți să aflați mai multe despre integrarea aplicației Siri în aplicația dvs. sau dacă doriți să aflați despre unele dintre celelalte funcții de dezvoltare cool ale iOS 10, consultați cursul lui Markus Mühlberger.

De asemenea, verificați câteva din celelalte tutoriale gratuite despre caracteristicile iOS 10.


Cod