Rozpoznávání řeči v Xamarin. iOS
Tento článek představuje nové rozhraní API pro rozpoznávání řeči a ukazuje, jak ho implementovat v aplikaci Xamarin. iOS, aby se podporovalo nepřetržité rozpoznávání řeči a přepisovat řeči (z živých nebo zaznamenaných zvukových streamů) na text.
Novinka v systému iOS 10 vydává 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řepisovat řeči (z živých nebo zaznamenaných zvukových streamů) na text.
Podle Applu má rozhraní API pro rozpoznávání řeči následující funkce a výhody:
- Velmi přesné
- Stav kresby
- Snadné použití
- Rychlý
- Podporuje více jazyků
- Respektuje ochranu osobních údajů uživatelů
Princip rozpoznávání řeči
Rozpoznávání řeči je implementováno v aplikaci pro iOS získáním živého nebo předem zaznamenaného zvuku (v jakémkoli z mluvených jazyků, které podporuje rozhraní API), a předáním do nástroje pro rozpoznávání řeči, který vrací přepis mluvených slov mluveného textu.
Diktování klávesnice
když si většina uživatelů myslí rozpoznávání řeči na zařízení s iOS, představí integrovaného hlasového asistenta Siri, který byl vydaný spolu s diktování klávesnice v iOS 5 s iPhone 4S.
Diktování klávesnice je podporováno jakýmkoli prvkem rozhraní, který podporuje TextKit (například UITextField nebo UITextArea ) a je aktivován uživatelem kliknutím na tlačítko diktování (přímo nalevo od mezerníku) na virtuální klávesnici iOS.
Společnost Apple vydala následující statistiky diktování klávesnice (shromážděné od 2011):
- Diktování klávesnice se běžně používá od vydání v iOS 5.
- Přibližně 65 000 využití aplikací za den.
- O třetině všech diktování iOS se provádí v aplikaci třetí strany.
Diktování klávesnice se velmi snadno používá, protože nevyžaduje žádné úsilí na část vývojáře, kromě použití prvku rozhraní TextKit v návrhu uživatelského rozhraní aplikace. Diktování klávesnice má také výhodu, že z aplikace nevyžadují žádné speciální požadavky na oprávnění, aby ji bylo možné použít.
Aplikace, které používají nová rozhraní API pro rozpoznávání řeči, budou vyžadovat udělení zvláštního oprávnění uživateli, protože rozpoznávání řeči vyžaduje přenos a dočasné úložiště dat na serverech společnosti Apple. Podrobnosti najdete v dokumentaci k vylepšení zabezpečení a ochrany osobních údajů .
I když je diktování klávesnice snadno naimplementované, přináší několik omezení a nevýhod:
- Vyžaduje použití pole textové zadání a zobrazení klávesnice.
- Funguje jenom s živým zvukovým vstupem a aplikace nemá žádnou kontrolu nad procesem záznamu zvuku.
- Neposkytuje žádnou kontrolu nad jazykem, který se používá k interpretaci řeči uživatele.
- Neexistuje žádný způsob, jak aplikace zjistit, jestli je tlačítko diktování pro uživatele ještě dostupné.
- Aplikace nemůže přizpůsobit proces záznamu zvuku.
- Poskytuje velmi bezstavové sady výsledků, které postrádají informace, jako je časování a důvěra.
Rozhraní API pro rozpoznávání řeči
Novinka v systému iOS 10, společnost Apple vydala rozhraní API pro rozpoznávání řeči, které poskytuje efektivnější způsob, jak aplikace pro iOS implementuje rozpoznávání řeči. Toto rozhraní API se shoduje s tím, že Apple používá k napájení v Siri i diktování klávesnice a je schopný zajistit rychlý přepis se stavem přesnosti v umění.
Výsledky poskytované rozhraním API pro rozpoznávání řeči jsou transparentně přizpůsobené jednotlivým uživatelům, a to bez toho, aby 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átky do volající aplikace téměř v reálném čase, protože uživatel mluví a poskytuje další informace o výsledcích překladu než jenom text. Tady jsou některé z nich:
- Několik výkladů, které uživatel uvedli.
- Úrovně spolehlivosti pro jednotlivé překlady.
- Informace o časování.
Jak je uvedeno výše, zvuk pro překlad lze poskytnout buď živým kanálem, nebo z předem nahraného zdroje a v jakémkoli z více než 50 jazyků a dialektů podporovaných systémem iOS 10.
Rozhraní API pro rozpoznávání řeči se dá použít na jakémkoli zařízení iOS se systémem iOS 10 a ve většině případů vyžaduje živé připojení k Internetu, protože k hromadnému překladu dochází na serverech Apple. Tato část uvádí, že některá novější zařízení s iOS podporují u konkrétních jazyků neustále zapnutý překlad na zařízení.
Společnost Apple zahrnovala rozhraní API dostupnosti k určení, jestli je daný jazyk k dispozici pro překlad v aktuálním okamžiku. Aplikace by měla používat toto rozhraní API místo testování přímo na připojení k Internetu.
Jak je uvedeno výše v části diktování klávesnice, rozpoznávání řeči vyžaduje přenos a dočasné úložiště dat na serverech společnosti Apple přes Internet a jako takový musí aplikace požádat uživatele o oprávnění k provedení rozpoznávání zahrnutím klíče do Info.plist souboru a voláním SFSpeechRecognizer.RequestAuthorization metody.
Na základě zdroje zvukového zvuku, který se používá pro rozpoznávání řeči, může být nutné provést další změny v Info.plist souboru aplikace. Podrobnosti najdete v dokumentaci k vylepšení zabezpečení a ochrany osobních údajů .
Přijetí rozpoznávání řeči v aplikaci
Existují čtyři hlavní kroky, které vývojář musí provést, aby bylo možné v aplikaci pro iOS přijmout rozpoznávání řeči:
- Zadejte popis použití v
Info.plistsouboru aplikace pomocíNSSpeechRecognitionUsageDescriptionklíče. Například aplikace kamery může obsahovat následující popis, což vám umožní pořizovat fotografii pouhým slovem "sýr". - Požádejte o autorizaci voláním
SFSpeechRecognizer.RequestAuthorizationmetody, která prezentuje vysvětlení (poskytované výše uvedenýmNSSpeechRecognitionUsageDescriptionklíčem), proč aplikace potřebuje přístup k rozpoznávání řeči uživateli v dialogovém okně a umožní jim přijmout nebo odmítnout. - Vytvořit požadavek na rozpoznávání řeči:
- V případě předem zaznamenaného zvuku na disku použijte
SFSpeechURLRecognitionRequesttřídu. - Pro živý zvuk (nebo zvuk z paměti) použijte
SFSPeechAudioBufferRecognitionRequesttřídu.
- V případě předem zaznamenaného zvuku na disku použijte
- Zahajte rozpoznávání řeči předáním požadavku na rozpoznávání řeči (
SFSpeechRecognizer). Aplikace může volitelně umístit na vrácenouSFSpeechRecognitionTaskmožnost monitorování a sledovat výsledky rozpoznávání.
Tyto kroky jsou podrobněji popsány níže.
Zadání popisu použití
Chcete-li NSSpeechRecognitionUsageDescription v souboru zadat požadovaný klíč Info.plist , postupujte následovně:
Dvakrát klikněte na
Info.plistsoubor a otevřete ho pro úpravy.Přepněte do zobrazení zdroje :
Klikněte na tlačítko Přidat novou položkua jako hodnotu Zadejte vlastnostpro typ a Popis použití . Například:
Pokud bude aplikace zpracovávat živý přepis, bude také vyžadovat popis použití mikrofonu. Klikněte na tlačítko Přidat novou položkua jako hodnotu Zadejte vlastnostpro typ a Popis použití . Například:
Uložte změny souboru.
Důležité
Pokud se nedaří poskytnout některé z výše uvedených Info.plist klíčů ( NSSpeechRecognitionUsageDescription nebo), NSMicrophoneUsageDescription může dojít k selhání aplikace bez upozornění při pokusu o přístup k rozpoznávání řeči nebo k mikrofonu pro živý zvuk.
Žádost o autorizaci
Pokud chcete požádat o autorizaci uživatelů, která umožňuje aplikaci získat přístup k rozpoznávání řeči, upravte třídu řadiče Main View 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;
}
});
}
}
}
RequestAuthorizationMetoda SFSpeechRecognizer třídy bude vyžadovat oprávnění od uživatele pro přístup k rozpoznávání řeči pomocí důvodu, že vývojář poskytl NSSpeechRecognitionUsageDescription klíč Info.plist souboru.
SFSpeechRecognizerAuthorizationStatusVýsledek se vrátí do RequestAuthorization rutiny zpětného volání metody, kterou lze použít k provedení akce na základě oprávnění uživatele.
Důležité
Apple navrhuje počkat, dokud uživatel nespustil akci v aplikaci, která před vyžádáním tohoto oprávnění vyžaduje rozpoznávání řeči.
Rozpoznávání předem zaznamenaného řeči
Pokud aplikace chce rozpoznávat řeč z předem zaznamenané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);
}
}
});
}
Podrobné prohlížení tohoto kódu se nejprve pokusí vytvořit nástroj pro rozpoznávání řeči ( SFSpeechRecognizer ). Pokud výchozí jazyk není podporován pro rozpoznávání řeči, null je vrácen a funkce se ukončí.
Pokud je pro výchozí jazyk k dispozici nástroj pro rozpoznávání řeči, aplikace zkontroluje, jestli je v tuto chvíli k dispozici pro rozpoznávání pomocí Available Vlastnosti. Například deaktivace nemusí být k dispozici, pokud zařízení nemá aktivní připojení k Internetu.
Vytvoří SFSpeechUrlRecognitionRequest se z NSUrl umístění předem nahraného souboru v zařízení se systémem iOS a je předána nástroji pro rozpoznávání řeči ke zpracování rutinou zpětného volání.
Při volání zpětného volání, pokud NSError není null k dispozici chyba, která musí být zpracována. Vzhledem k tomu, že rozpoznávání řeči je provedeno přírůstkově, může být rutina zpětného volání volána více než jednou, takže SFSpeechRecognitionResult.Final vlastnost je testována, aby zjistila, zda je překlad dokončen a aby byla zapsána nejlepší verze překladu ( BestTranscription ).
Rozpoznávání živého řeči
Pokud aplikace chce rozpoznávat živý řeč, je tento proces velmi podobný rozpoznávání předem zaznamenaného hlasu. Napří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 ();
}
Podrobné prohlížení tohoto kódu vytváří několik soukromý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;
Pomocí AV Foundation zaznamenává zvuk, který se předává k žádosti o SFSpeechAudioBufferRecognitionRequest rozpozná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 záznam a všechny chyby budou zpracovány, pokud záznam nelze spustit:
AudioEngine.Prepare ();
NSError error;
AudioEngine.StartAndReturnError (out error);
// Did recording start?
if (error != null) {
// Handle error and return
...
return;
}
Spustí se úloha rozpoznávání a zachová se popisovač úlohy rozpoznávání ( SFSpeechRecognitionTask ):
RecognitionTask = SpeechRecognizer.GetRecognitionTask (LiveSpeechRequest, (SFSpeechRecognitionResult result, NSError err) => {
...
});
Zpětné volání se používá podobným způsobem jako ten použitý výše na předem zaznamenaném rozpoznávání řeči.
Pokud uživatel záznam zastaví, bude informován zvukový stroj i požadavek na rozpoznávání řeči:
AudioEngine.Stop ();
LiveSpeechRequest.EndAudio ();
Pokud uživatel zruší rozpoznávání, bude informován zvukový modul a úloha rozpoznávání:
AudioEngine.Stop ();
RecognitionTask.Cancel ();
Je důležité volat, RecognitionTask.Cancel Pokud uživatel zruší překlad, aby uvolnil jak paměť, tak i procesor zařízení.
Důležité
Neúspěšné poskytnutí NSSpeechRecognitionUsageDescriptionNSMicrophoneUsageDescriptionInfo.plist klíčů nebo může způsobit selhání aplikace bez upozornění při pokusu o přístup k rozpoznávání řeči nebo mikrofonu pro živý zvuk ( var node = AudioEngine.InputNode; ). Další informace najdete v části zadání popisu použití výše.
Omezení rozpoznávání řeči
Při práci s rozpoznáváním řeči v aplikaci pro iOS přináší společnost Apple následující omezení:
- Rozpoznávání řeči je zdarma pro všechny aplikace, ale jeho použití není neomezené:
- Jednotlivá zařízení s iOS mají omezený počet rozpoznávání, která se dají provést za den.
- Aplikace se omezují globálně na základě žádosti na den.
- Aplikace musí být připravená zpracovat síťové připojení rozpoznávání řeči a chyby omezení četnosti 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 iOS daného uživatele, a to z toho důvodu, že Apple omezuje striktní dobu trvání zvuku přibližně na jednu minutu maximálního množství řeči.
Pokud aplikace zasáhne své limity omezování rychlosti, požádá Apple, aby je kontaktoval.
Požadavky na ochranu osobních údajů a použitelnost
Apple má následující návrh, který je transparentní a respektuje ochranu osobních údajů uživatele při zahrnutí rozpoznávání řeči v aplikaci pro iOS:
- Při zaznamenávání řeči uživatele nezapomeňte jasně označit, že záznam probíhá v uživatelském rozhraní aplikace. Aplikace může například přehrát zvuk "záznam" a zobrazit indikátor záznamu.
- Nepoužívejte rozpoznávání řeči pro citlivé uživatelské informace, jako jsou hesla, data o stavu nebo finanční informace.
- Zobrazit výsledky rozpoznávání před tím, než na nich budou pracovat. To nejen poskytuje zpětnou vazbu k tomu, co aplikace dělá, ale umožňuje uživateli zpracovat chyby rozpoznávání při jejich provedení.
Souhrn
V tomto článku jsme si poznamenali nové rozhraní API pro rozpoznávání řeči a ukázali, jak ho implementovat v aplikaci Xamarin. iOS, aby se podporovalo nepřetržité rozpoznávání řeči a přepisovat řeči (z živých nebo zaznamenaných zvukových streamů) do textu.





