Rozpoznávání řeči v Xamarin.iOS
Tento článek představuje nové rozhraní Speech API a ukazuje, jak ho implementovat v aplikaci Xamarin.iOS, která podporuje průběžné rozpoznávání řeči a přepis řeči (z živých nebo nahraných zvukových proudů) do textu.
Apple vydal nové rozhraní API pro rozpoznávání řeči, které umožňuje aplikaci pro iOS podporovat nepřetržité rozpoznávání řeči a přepis řeči (z živých nebo nahraných zvukových proudů) do textu.
Rozhraní API pro rozpoznávání řeči má podle Společnosti Apple následující funkce a výhody:
- Vysoce přesné
- State of the Art
- Snadné použití
- Rychlé
- Podporuje více jazyků.
- Respektuje ochranu osobních údajů uživatelů
Jak funguje rozpoznávání řeči
Rozpoznávání řeči se implementuje v aplikaci pro iOS získáním živého nebo předem nahraného zvuku (v libovolném mluveném jazyce, který rozhraní API podporuje) a předáním do služby Rozpoznávání řeči, která vrací přepis mluveného slova ve formátu prostého textu.
Diktování klávesnice
Když si většina uživatelů na zařízení s iOSem myslí rozpoznávání řeči, myslí si, že jde o integrovaného hlasového asistenta Siri, který byl vydán spolu s diktováním klávesnice v iOSu 5 s iPhonem 4S.
Diktování klávesnice podporuje jakýkoli prvek rozhraní, který podporuje TextKit (například UITextField
nebo UITextArea
) a aktivuje ho uživatel, který na virtuální klávesnici pro iOS klikne na tlačítko Diktování (přímo nalevo od mezerníku).
Společnost Apple vydala následující statistiky diktování pomocí klávesnice (shromážděné od roku 2011):
- Diktování klávesnice se od vydání v iOSu 5 běžně používá.
- Přibližně 65 000 aplikací ji denně používá.
- Asi třetí ze všech diktování pro iOS se provádí v aplikaci třetí strany.
Diktování pomocí klávesnice je velmi snadné, protože nevyžaduje žádné úsilí na straně vývojáře, kromě použití elementu rozhraní TextKit v návrhu uživatelského rozhraní aplikace. Diktování pomocí klávesnice má také výhodu, že před jeho používáním nevyžaduje žádné zvláštní žádosti o oprávnění z aplikace.
Aplikace, které používají nová rozhraní API pro rozpoznávání řeči, budou vyžadovat, aby uživateli udělil zvláštní oprávnění, protože rozpoznávání řeči vyžaduje přenos a dočasné ukládání dat na serverech společnosti Apple. Podrobnosti najdete v dokumentaci k vylepšením zabezpečení a ochrany osobních údajů.
I když se diktování pomocí klávesnice snadno implementuje, má několik omezení a nevýhod:
- Vyžaduje použití textového vstupního pole a zobrazení klávesnice.
- Funguje jenom se vstupem živého zvuku a aplikace nemá žádnou kontrolu nad procesem nahrávání zvuku.
- Neposkytuje žádnou kontrolu nad jazykem, který se používá k interpretaci řeči uživatele.
- Neexistuje způsob, jak aplikace zjistit, jestli je tlačítko Diktování dokonce dostupné pro uživatele.
- Aplikace nemůže přizpůsobit proces nahrávání zvuku.
- Poskytuje velmi mělký soubor výsledků, které nemají informace, jako je načasování a spolehlivost.
Rozhraní API pro rozpoznávání řeči
V iOSu 10 společnost Apple vydala rozhraní API pro rozpoznávání řeči, které poskytuje výkonnější způsob implementace rozpoznávání řeči v aplikaci pro iOS. Toto rozhraní API je stejné, jaké Apple používá k napájení Siri i diktování pomocí klávesnice a dokáže poskytovat rychlý přepis se stavem špičkové přesnosti.
Výsledky poskytované rozhraním API pro rozpoznávání řeči se transparentně přizpůsobí jednotlivým uživatelům, aniž by aplikace musela shromažďovat nebo přistupovat k soukromým uživatelským datům.
Rozhraní API pro rozpoznávání řeči poskytuje výsledky zpět volající aplikaci téměř v reálném čase, protože uživatel mluví, a poskytuje více informací o výsledcích překladu než jen o textu. Tady jsou některé z nich:
- Více interpretací toho, co uživatel řekl.
- Úrovně spolehlivosti pro jednotlivé překlady
- Informace o časování
Jak je uvedeno výše, zvuk pro překlad lze poskytovat buď živým kanálem, nebo z předem nahraného zdroje a v libovolném z více než 50 jazyků a dialektů podporovaných iOSem 10.
Rozhraní API pro rozpoznávání řeči se dá použít na jakémkoli zařízení s iOSem s iOSem 10 a ve většině případů vyžaduje živé připojení k internetu, protože většina překladů probíhá na serverech Společnosti Apple. To znamená, že některá novější zařízení s iOSem podporují vždy zapnutý překlad konkrétních jazyků na zařízeních.
Společnost Apple zahrnula rozhraní API pro dostupnost k určení, jestli je daný jazyk k dispozici pro překlad v aktuálním okamžiku. Aplikace by měla místo testování připojení k internetu používat toto rozhraní API přímo.
Jak je uvedeno výše v části Diktování klávesnice, rozpoznávání řeči vyžaduje přenos a dočasné ukládání dat na serverech Společnosti Apple přes internet, a proto musí aplikace požádat uživatele o oprávnění k provádění rozpoznávání zahrnutím NSSpeechRecognitionUsageDescription
klíče do souboru Info.plist
a volání SFSpeechRecognizer.RequestAuthorization
metody.
Na základě zdroje zvuku používaného pro rozpoznávání řeči můžou být potřeba další změny souboru aplikace Info.plist
. Podrobnosti najdete v dokumentaci k vylepšením zabezpečení a ochrany osobních údajů.
Přijetí rozpoznávání řeči v aplikaci
Vývojář musí přijmout rozpoznávání řeči v aplikaci pro iOS čtyřmi hlavními kroky:
- Zadejte popis použití v souboru aplikace
Info.plist
pomocíNSSpeechRecognitionUsageDescription
klíče. Aplikace fotoaparátu může například obsahovat následující popis: "To vám umožní pořídit fotku tak, že řeknete slovo "sýr". - Požádejte o autorizaci voláním
SFSpeechRecognizer.RequestAuthorization
metody, která zobrazí vysvětlení (uvedené vNSSpeechRecognitionUsageDescription
klíči výše), proč aplikace chce přístup k rozpoznávání řeči uživateli v dialogovém okně a umožnit mu přijmout nebo odmítnout. - Vytvoření žádosti o rozpoznávání řeči:
- Pro předem nahraný zvuk na disku použijte
SFSpeechURLRecognitionRequest
třídu. - Pro živý zvuk (nebo zvuk z paměti) použijte
SFSPeechAudioBufferRecognitionRequest
třídu.
- Pro předem nahraný zvuk na disku použijte
- Předejte žádost o rozpoznávání řeči do služby Rozpoznávání řeči (
SFSpeechRecognizer
) pro zahájení rozpoznávání řeči. Aplikace může volitelně držet vrácený monitorSFSpeechRecognitionTask
a sledovat výsledky rozpoznávání.
Tyto kroky jsou podrobně popsané níže.
Zadání popisu využití
Pokud chcete v Info.plist
souboru zadat požadovaný NSSpeechRecognitionUsageDescription
klíč, postupujte takto:
Poklikáním otevřete
Info.plist
soubor pro úpravy.Přepněte do zobrazení Zdroj :
Klikněte na Přidat novou položku, zadejte
NSSpeechRecognitionUsageDescription
pro vlastnost typString
a popis použití jako hodnotu. Příklad:Pokud aplikace bude zpracovávat přepis živého zvuku, bude také vyžadovat popis použití mikrofonu. Klikněte na Přidat novou položku, zadejte
NSMicrophoneUsageDescription
pro vlastnost typString
a popis použití jako hodnotu. Příklad:Uložte změny souboru.
Důležité
Info.plist
NSSpeechRecognitionUsageDescription
NSMicrophoneUsageDescription
Při pokusu o přístup k rozpoznávání řeči nebo mikrofonu pro živý zvuk může dojít k selhání aplikace bez upozornění.
Žádost o autorizaci
Pokud chcete požádat o požadovanou autorizaci uživatele, která aplikaci umožňuje přístup k rozpoznávání řeči, upravte hlavní třídu kontroleru zobrazení a přidejte následující kód:
using System;
using UIKit;
using Speech;
namespace MonkeyTalk
{
public partial class ViewController : UIViewController
{
protected ViewController (IntPtr handle) : base (handle)
{
// Note: this .ctor should not contain any initialization logic.
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Request user authorization
SFSpeechRecognizer.RequestAuthorization ((SFSpeechRecognizerAuthorizationStatus status) => {
// Take action based on status
switch (status) {
case SFSpeechRecognizerAuthorizationStatus.Authorized:
// User has approved speech recognition
...
break;
case SFSpeechRecognizerAuthorizationStatus.Denied:
// User has declined speech recognition
...
break;
case SFSpeechRecognizerAuthorizationStatus.NotDetermined:
// Waiting on approval
...
break;
case SFSpeechRecognizerAuthorizationStatus.Restricted:
// The device is not permitted
...
break;
}
});
}
}
}
RequestAuthorization
Metoda SFSpeechRecognizer
třídy požádá uživatele o oprávnění pro přístup k rozpoznávání řeči pomocí důvodu, že vývojář zadal klíč NSSpeechRecognitionUsageDescription
Info.plist
souboru.
SFSpeechRecognizerAuthorizationStatus
Výsledek se vrátí do RequestAuthorization
rutiny zpětného volání metody, která se dá použít k provedení akce na základě oprávnění uživatele.
Důležité
Apple navrhuje počkat, dokud uživatel v aplikaci nespustí akci, která vyžaduje rozpoznávání řeči před vyžádáním tohoto oprávnění.
Rozpoznávání předem zaznamenané řeči
Pokud chce aplikace rozpoznat řeč z předem nahraného souboru WAV nebo MP3, může použít následující kód:
using System;
using UIKit;
using Speech;
using Foundation;
...
public void RecognizeFile (NSUrl url)
{
// Access new recognizer
var recognizer = new SFSpeechRecognizer ();
// Is the default language supported?
if (recognizer == null) {
// No, return to caller
return;
}
// Is recognition available?
if (!recognizer.Available) {
// No, return to caller
return;
}
// Create recognition task and start recognition
var request = new SFSpeechUrlRecognitionRequest (url);
recognizer.GetRecognitionTask (request, (SFSpeechRecognitionResult result, NSError err) => {
// Was there an error?
if (err != null) {
// Handle error
...
} else {
// Is this the final translation?
if (result.Final) {
Console.WriteLine ("You said, \"{0}\".", result.BestTranscription.FormattedString);
}
}
});
}
Při podrobném pohledu na tento kód se nejprve pokusí vytvořit rozpoznávání řeči (SFSpeechRecognizer
). Pokud se pro rozpoznávání řeči nepodporuje výchozí jazyk, null
vrátí se funkce a funkce se ukončí.
Pokud je rozpoznávání řeči dostupné pro výchozí jazyk, aplikace zkontroluje, jestli je aktuálně k dispozici pro rozpoznávání pomocí Available
vlastnosti. Rozpoznávání například nemusí být dostupné, pokud zařízení nemá aktivní připojení k internetu.
Vytvoří SFSpeechUrlRecognitionRequest
se z NSUrl
umístění předem zaznamenaného souboru na zařízení s iOSem a předá se službě Rozpoznávání řeči ke zpracování pomocí rutiny zpětného volání.
Při volání zpětného volání došlo k chybě, NSError
null
která se musí zpracovat. Vzhledem k tomu, že rozpoznávání řeči probíhá přírůstkově, může se rutina zpětného volání volat více než jednou, takže SFSpeechRecognitionResult.Final
se vlastnost testuje, aby se zjistilo, jestli je překlad dokončený a jestli se zapíše nejlepší verze překladu (BestTranscription
).
Rozpoznávání živé řeči
Pokud chce aplikace rozpoznat živou řeč, je proces velmi podobný rozpoznávání předem zaznamenané řeči. Příklad:
using System;
using UIKit;
using Speech;
using Foundation;
using AVFoundation;
...
#region Private Variables
private AVAudioEngine AudioEngine = new AVAudioEngine ();
private SFSpeechRecognizer SpeechRecognizer = new SFSpeechRecognizer ();
private SFSpeechAudioBufferRecognitionRequest LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest ();
private SFSpeechRecognitionTask RecognitionTask;
#endregion
...
public void StartRecording ()
{
// Setup audio session
var node = AudioEngine.InputNode;
var recordingFormat = node.GetBusOutputFormat (0);
node.InstallTapOnBus (0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => {
// Append buffer to recognition request
LiveSpeechRequest.Append (buffer);
});
// Start recording
AudioEngine.Prepare ();
NSError error;
AudioEngine.StartAndReturnError (out error);
// Did recording start?
if (error != null) {
// Handle error and return
...
return;
}
// Start recognition
RecognitionTask = SpeechRecognizer.GetRecognitionTask (LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => {
// Was there an error?
if (err != null) {
// Handle error
...
} else {
// Is this the final translation?
if (result.Final) {
Console.WriteLine ("You said \"{0}\".", result.BestTranscription.FormattedString);
}
}
});
}
public void StopRecording ()
{
AudioEngine.Stop ();
LiveSpeechRequest.EndAudio ();
}
public void CancelRecording ()
{
AudioEngine.Stop ();
RecognitionTask.Cancel ();
}
Při podrobném pohledu na tento kód vytvoří několik privátních proměnných pro zpracování procesu rozpoznávání:
private AVAudioEngine AudioEngine = new AVAudioEngine ();
private SFSpeechRecognizer SpeechRecognizer = new SFSpeechRecognizer ();
private SFSpeechAudioBufferRecognitionRequest LiveSpeechRequest = new SFSpeechAudioBufferRecognitionRequest ();
private SFSpeechRecognitionTask RecognitionTask;
Používá AV Foundation k záznamu zvuku, který se předá SFSpeechAudioBufferRecognitionRequest
do zpracování žádosti o rozpoznávání:
var node = AudioEngine.InputNode;
var recordingFormat = node.GetBusOutputFormat (0);
node.InstallTapOnBus (0, 1024, recordingFormat, (AVAudioPcmBuffer buffer, AVAudioTime when) => {
// Append buffer to recognition request
LiveSpeechRequest.Append (buffer);
});
Aplikace se pokusí spustit nahrávání a všechny chyby se zpracují, pokud záznam nejde spustit:
AudioEngine.Prepare ();
NSError error;
AudioEngine.StartAndReturnError (out error);
// Did recording start?
if (error != null) {
// Handle error and return
...
return;
}
Úloha rozpoznávání je spuštěna a popisovač se uchovává na úlohu rozpoznávání (SFSpeechRecognitionTask
):
RecognitionTask = SpeechRecognizer.GetRecognitionTask (LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => {
...
});
Zpětné volání se používá podobným způsobem jako u předznamenané řeči.
Pokud uživatel záznam zastaví, informuje se zvukový modul i žádost o rozpoznávání řeči:
AudioEngine.Stop ();
LiveSpeechRequest.EndAudio ();
Pokud uživatel zruší rozpoznávání, bude o tom informován zvukový stroj a úloha rozpoznávání:
AudioEngine.Stop ();
RecognitionTask.Cancel ();
Je důležité volat RecognitionTask.Cancel
, pokud uživatel zruší překlad, aby uvolnil paměť i procesor zařízení.
Důležité
NSSpeechRecognitionUsageDescription
Info.plist
NSMicrophoneUsageDescription
Při pokusu o přístup k rozpoznávání řeči nebo mikrofonu pro živý zvukvar node = AudioEngine.InputNode;
může dojít k selhání aplikace bez upozornění. Další informace najdete v části Popis použití výše.
Omezení rozpoznávání řeči
Apple při práci s rozpoznáváním řeči v aplikaci pro iOS uplatňuje následující omezení:
- Rozpoznávání řeči je bezplatné pro všechny aplikace, ale jeho použití není neomezené:
- Jednotlivá zařízení s iOSem mají omezený počet rozpoznávání, která se dají provádět za den.
- Aplikace se omezí globálně na základě požadavků za den.
- Aplikace musí být připravená na zpracování síťového připojení k rozpoznávání řeči a selhání omezení rychlosti využití.
- Rozpoznávání řeči může mít vysoké náklady na vyprázdnění baterie i vysoké síťové přenosy na zařízení s iOSem uživatele, z tohoto důvodu Apple omezuje striktní dobu trvání zvuku přibližně jednu minutu hlasového maxima.
Pokud aplikace pravidelně dochází k dosažení limitů omezování rychlosti, Apple se zeptá, že je vývojář kontaktuje.
Aspekty ochrany osobních údajů a použitelnosti
Apple nabízí následující návrh, aby byl transparentní a respektoval soukromí uživatele při zahrnutí rozpoznávání řeči v aplikaci pro iOS:
- Při nahrávání řeči uživatele nezapomeňte jasně indikovat, že nahrávání probíhá v uživatelském rozhraní aplikace. Aplikace může například přehrát zvuk "nahrávání" a zobrazit indikátor záznamu.
- Nepoužívejte rozpoznávání řeči pro citlivé informace o uživatelích, jako jsou hesla, údaje o stavu nebo finanční informace.
- Před tím, než na ně začnete jednat, zobrazí výsledky rozpoznávání. To nejen poskytuje zpětnou vazbu k tomu, co aplikace dělá, ale umožňuje uživateli zpracovávat chyby rozpoznávání při jejich provádění.
Shrnutí
Tento článek představil nové rozhraní Speech API a ukázal, jak ho implementovat v aplikaci Xamarin.iOS, která podporuje průběžné rozpoznávání řeči a přepis řeči (z živých nebo nahraných zvukových proudů) do textu.