Sdílet prostřednictvím


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.

Jak funguje rozpoznávání řeči

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é v NSSpeechRecognitionUsageDescription 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.
  • 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ý monitor SFSpeechRecognitionTask 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:

  1. Poklikáním otevřete Info.plist soubor pro úpravy.

  2. Přepněte do zobrazení Zdroj :

    Zobrazení Zdroj

  3. Klikněte na Přidat novou položku, zadejte NSSpeechRecognitionUsageDescription pro vlastnost typ String a popis použití jako hodnotu. Příklad:

    Přidání NSSpeechRecognitionUsageDescription

  4. 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 typ String a popis použití jako hodnotu. Příklad:

    Přidání NSMicrophoneUsageDescription

  5. Uložte změny souboru.

Důležité

Info.plistNSSpeechRecognitionUsageDescription NSMicrophoneUsageDescriptionPř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.