Používání dávkového přepisu

Dávkový přepis je sada REST API operací, které umožňují přepis velkého množství zvuku v úložišti. Můžete odkazovat na zvukové soubory pomocí typického identifikátoru URI nebo identifikátoru URI sdíleného přístupového podpisu (SAS) a asynchronně přijímat výsledky přepisu. Pomocí rozhraní API v3.0 můžete přepisovat jeden nebo více zvukových souborů nebo zpracovat celý kontejner úložiště.

Rozhraní REST API pro dávkový přepis můžete použít k volání následujících metod:

Operace dávkového přepisu Metoda REST API volání
Vytvoří nový přepis. POST speechtotext/ v3.0 / přepisy
Načte seznam přepisů pro ověřené předplatné. GET speechtotext/ v3.0 / přepisy
Získá seznam podporovaných národní prostředí pro offline přepisy. GET speechtotext/v3.0/transcriptions/locales
Aktualizuje mutable podrobnosti přepisu identifikované jeho ID. OPRAVA speechtotext/v3.0/transcriptions/{id}
Odstraní zadanou úlohu přepisu. DELETE speechtotext/v3.0/transcriptions/{id}
Získá přepis identifikované daným ID. GET speechtotext/v3.0/transcriptions/{id}
Získá výsledné soubory přepisu identifikované daným ID. GET speechtotext/v3.0/transcriptions/{id}/files

Podrobné rozhraní API, které je k dispozici jako dokument Swagger,můžete zkontrolovat a otestovat.

Úlohy dávkového přepisu se plánují v rámci možností. Není možné odhadnout, kdy úloha přejde do spuštěného stavu, ale za normálního zatížení systému by k tomu mělo dojít během několika minut. Jakmile bude úloha ve spuštěném stavu, přepis proběhne rychleji než přehrávání zvuku za běhu.

Požadavky

Stejně jako u všech funkcí služby Speech vytvoříte klíč předplatného z webu Azure Portal podle naší příručky Začínáme.

Poznámka

K použití dávkového přepisu se vyžaduje standardní předplatné (S0) pro službu Speech. Klíče bezplatného předplatného (F0) nebudou fungovat. Další informace najdete v tématu ceny a omezení.

Pokud máte v plánu přizpůsobit modely, postupujte podle kroků v části Akustické přizpůsobení a Přizpůsobení jazyka. Pokud chcete vytvořené modely používat v dávkovém přepisu, potřebujete jejich umístění. Umístění modelu můžete načíst při kontrole podrobností modelu ( self vlastnost). Nasazený vlastní koncový bod není pro službu dávkového přepisu potřeba.

Poznámka

V rámci tohoto REST API má přepis služby Batch sadu kvót a omezení,které doporučujeme zkontrolovat. Pokud chcete plně využít možnost přepisu služby Batch k efektivnímu přepisu velkého počtu zvukových souborů, doporučujeme vždy odeslat několik souborů na požadavek nebo odkazovat na kontejner služby Blob Storage se zvukovými soubory k přepisu. Služba soubory přepisuje souběžně a zkrátí dobu vyhovění. Použití více souborů v jednom požadavku je velmi jednoduché a jednoduché – viz oddíl Konfigurace.

Rozhraní API pro dávkový přepis

Rozhraní API pro dávkový přepis podporuje následující formáty:

Formát Kodek Bity na vzorek Vzorkovací frekvence
WAV PCM 16bitový 8 kHz nebo 16 kHz, mono nebo stereo
MP3 PCM 16bitový 8 kHz nebo 16 kHz, mono nebo stereo
OGG OPUS 16bitový 8 kHz nebo 16 kHz, mono nebo stereo

U stereo zvukových streamů se levé a pravé kanály rozdělí během přepisu. Pro každý kanál se vytváří výsledný soubor JSON. Pokud chcete vytvořit uspořádaný finální přepis, použijte časová razítka vygenerovaná pro jednu protterance.

Konfigurace

Parametry konfigurace jsou k dispozici ve formátu JSON.

Přepis jednoho nebo více jednotlivých souborů. Pokud máte k přepisu více než jeden soubor, doporučujeme odeslat několik souborů v jednom požadavku. Následující příklad používá tři soubory:

{
  "contentUrls": [
    "<URL to an audio file 1 to transcribe>",
    "<URL to an audio file 2 to transcribe>",
    "<URL to an audio file 3 to transcribe>"
  ],
  "properties": {
    "wordLevelTimestampsEnabled": true
  },
  "locale": "en-US",
  "displayName": "Transcription of file using default model for en-US"
}

Zpracování celého kontejneru úložiště SAS kontejneru by měl r obsahovat oprávnění l (čtení) a (seznam):

{
  "contentContainerUrl": "<SAS URL to the Azure blob container to transcribe>",
  "properties": {
    "wordLevelTimestampsEnabled": true
  },
  "locale": "en-US",
  "displayName": "Transcription of container using default model for en-US"
}

Použijte vlastní natrénovaný model v dávkovém přepisu. Příklad používá tři soubory:

{
  "contentUrls": [
    "<URL to an audio file 1 to transcribe>",
    "<URL to an audio file 2 to transcribe>",
    "<URL to an audio file 3 to transcribe>"
  ],
  "properties": {
    "wordLevelTimestampsEnabled": true
  },
  "locale": "en-US",
  "model": {
    "self": "https://westus.api.cognitive.microsoft.com/speechtotext/v3.0/models/{id}"
  },
  "displayName": "Transcription of file using default model for en-US"
}

Vlastnosti konfigurace

Ke konfiguraci přepisu použijte tyto volitelné vlastnosti:

Parametr

Popis

profanityFilterMode

Volitelné, výchozí hodnota je Masked . Určuje, jak zpracovat vulgární výrazy ve výsledcích rozpoznávání. Akceptovány hodnoty jsou zakázání filtrování vulgárních výrazů, nahrazení vulgárních výrazů hvězdičkami, odebrání všech vulgárních výrazů z výsledku nebo přidání značek None Masked Removed "vulgárních Tags výrazů".

punctuationMode

Volitelné, výchozí hodnota je DictatedAndAutomatic . Určuje, jak zpracovat interpunkci ve výsledcích rozpoznávání. Mezi akceptované hodnoty se používá zákaz interpunkce, explicitní (mluvená) interpunkce, aby dekodér rozdmýchal interpunkci nebo aby se používá diktovaná a automatická None Dictated Automatic DictatedAndAutomatic interpunkce.

wordLevelTimestampsEnabled

Ve výchozím false nastavení volitelné. Určuje, jestli se mají do výstupu přidat časová razítka na úrovni slov.

diarizationEnabled

Ve výchozím false nastavení volitelné. Určuje, že se má na vstupu provádět analýza diarizace, která by měla být monokanály obsahující dva hlasy. Poznámka: Vyžaduje wordLevelTimestampsEnabled se, aby byla nastavená na true .

channels

Volitelné a 0 1 přepisované ve výchozím nastavení. Pole čísel kanálů ke zpracování. Tady je možné zadat podmnožinu dostupných kanálů ve zvukovém souboru, které se mají zpracovat (například 0 jenom ).

timeToLive

Volitelné, žádné odstranění ve výchozím nastavení. Doba platnosti pro automatické odstranění přepisů po dokončení přepisu. Funkce je užitečná při hromadném zpracování přepisů, aby se zajistilo jejich případné timeToLive odstranění (například PT12H po dobu 12 hodin).

destinationContainerUrl

Volitelná adresa URL s ad hoc SAS do zapisovatelného kontejneru v Azure Výsledek se uloží v tomto kontejneru. Sas s uloženými zásadami přístupu se nepodporuje. Pokud není zadaný, Microsoft uloží výsledky do kontejneru úložiště spravovaného Microsoftem. Když se přepis odstraní voláním funkce Odstranit přepis,odstraní se také výsledná data.

Storage

Dávkový přepis může číst zvuk z veřejně viditelného internetového identifikátoru URI a může číst zvuk nebo zapisovat přepisy pomocí identifikátoru URI SAS s úložištěm objektů blob v Azure.

Výsledek dávkového přepisu

Pro každý zvukový vstup se vytvoří jeden výsledný soubor přepisu. Operace Získat soubory přepisů vrátí seznam výsledných souborů pro tento přepis. Pokud chcete najít soubor přepisu pro konkrétní vstupní soubor, vyfiltrujte všechny vrácené soubory pomocí a kind == Transcription name == {originalInputName.suffix}.json .

Každý soubor výsledku přepisu má tento formát:

{
  "source": "...",                      // sas url of a given contentUrl or the path relative to the root of a given container
  "timestamp": "2020-06-16T09:30:21Z",  // creation time of the transcription, ISO 8601 encoded timestamp, combined date and time
  "durationInTicks": 41200000,          // total audio duration in ticks (1 tick is 100 nanoseconds)
  "duration": "PT4.12S",                // total audio duration, ISO 8601 encoded duration
  "combinedRecognizedPhrases": [        // concatenated results for simple access in single string for each channel
    {
      "channel": 0,                     // channel number of the concatenated results
      "lexical": "hello world",
      "itn": "hello world",
      "maskedITN": "hello world",
      "display": "Hello world."
    }
  ],
  "recognizedPhrases": [                // results for each phrase and each channel individually
    {
      "recognitionStatus": "Success",   // recognition state, e.g. "Success", "Failure"
      "speaker": 1,                     // if `diarizationEnabled` is `true`, this is the identified speaker (1 or 2), otherwise this property is not present
      "channel": 0,                     // channel number of the result
      "offset": "PT0.07S",              // offset in audio of this phrase, ISO 8601 encoded duration
      "duration": "PT1.59S",            // audio duration of this phrase, ISO 8601 encoded duration
      "offsetInTicks": 700000.0,        // offset in audio of this phrase in ticks (1 tick is 100 nanoseconds)
      "durationInTicks": 15900000.0,    // audio duration of this phrase in ticks (1 tick is 100 nanoseconds)

      // possible transcriptions of the current phrase with confidences
      "nBest": [
        {
          "confidence": 0.898652852,    // confidence value for the recognition of the whole phrase
          "lexical": "hello world",
          "itn": "hello world",
          "maskedITN": "hello world",
          "display": "Hello world.",

          // if wordLevelTimestampsEnabled is `true`, there will be a result for each word of the phrase, otherwise this property is not present
          "words": [
            {
              "word": "hello",
              "offset": "PT0.09S",
              "duration": "PT0.48S",
              "offsetInTicks": 900000.0,
              "durationInTicks": 4800000.0,
              "confidence": 0.987572
            },
            {
              "word": "world",
              "offset": "PT0.59S",
              "duration": "PT0.16S",
              "offsetInTicks": 5900000.0,
              "durationInTicks": 1600000.0,
              "confidence": 0.906032
            }
          ]
        }
      ]
    }
  ]
}

Výsledek obsahuje následující pole:

Pole

Obsah

lexical

Skutečná rozpoznaná slova.

itn

Inverzní text normalizovaná forma rozpoznaného textu. Používají se zkratky ("lékař smith" na "dr smith"), telefonní čísla a další transformace.

maskedITN

Formulář ITN s použitým maskou vulgárních výrazů

display

Zobrazovaný tvar rozpoznaného textu. Přidaná interpunkce a velká písmena jsou zahrnuty.

Oddělení mluvčího (diarizace)

Diarizace je proces oddělení mluvčích v části zvuku. Dávkový kanál podporuje diarizaci a dokáže rozpoznát dva mluvčí na nahrávkách v monokanálu. Tato funkce není dostupná u stereo nahrávek.

Výstup přepisu s povolenou diarizací obsahuje Speaker záznam pro každou přepsané frázi. Pokud se diarizace nepouží, vlastnost se ve výstupu Speaker JSON nenachová. Pro diarizaci podporujeme dva hlasy, takže mluvčí jsou identifikováni jako 1 nebo 2 .

Pokud chcete požádat o diarizaci, přidejte vlastnost diarizationEnabled na hodnotu , jak je true znázorněno níže v požadavku HTTP.

{
  "contentUrls": [
    "<URL to an audio file to transcribe>",
  ],
  "properties": {
    "diarizationEnabled": true,
    "wordLevelTimestampsEnabled": true,
    "punctuationMode": "DictatedAndAutomatic",
    "profanityFilterMode": "Masked"
  },
  "locale": "en-US",
  "displayName": "Transcription of file using default model for en-US"
}

Jako označení parametrů ve výše uvedeném požadavku musí být povolená časová razítka na úrovni slov.

Osvědčené postupy

Služba dávkového přepisu dokáže zpracovat velký počet odeslaých přepisů. Stav přepisů můžete dotazovat pomocí získat přepisy. Po načtení výsledků pravidelně volejte možnost Odstranit přepis ze služby. Případně nastavte timeToLive vlastnost , abyste zajistili případné odstranění výsledků.

Tip

Ke zpracování vysokých objemů zvuku můžete použít klientský nástroj pro příjem dat a výsledné řešení.

Ukázka kódu

Kompletní ukázky jsou k dispozici v GitHub ukázkovém úložišti v samples/batch podadresáři .

Aktualizujte vzorový kód informacemi o vašem předplatném, oblasti služby, identifikátoru URI odkazující na zvukový soubor k přepisu a umístěním modelu, pokud používáte vlastní model.

var newTranscription = new Transcription
{
    DisplayName = DisplayName, 
    Locale = Locale, 
    ContentUrls = new[] { RecordingsBlobUri },
    //ContentContainerUrl = ContentAzureBlobContainer,
    Model = CustomModel,
    Properties = new TranscriptionProperties
    {
        IsWordLevelTimestampsEnabled = true,
        TimeToLive = TimeSpan.FromDays(1)
    }
};

newTranscription = await client.CreateTranscriptionAsync(newTranscription).ConfigureAwait(false);
Console.WriteLine($"Created transcription {newTranscription.Self}");

Ukázkový kód nastaví klienta a odešle požadavek na přepis. Pak se dotazuje na informace o stavu a vytiskne podrobnosti o průběhu přepisu.

// get the status of our transcriptions periodically and log results
int completed = 0, running = 0, notStarted = 0;
while (completed < 1)
{
    completed = 0; running = 0; notStarted = 0;

    // get all transcriptions for the user
    paginatedTranscriptions = null;
    do
    {
        // <transcriptionstatus>
        if (paginatedTranscriptions == null)
        {
            paginatedTranscriptions = await client.GetTranscriptionsAsync().ConfigureAwait(false);
        }
        else
        {
            paginatedTranscriptions = await client.GetTranscriptionsAsync(paginatedTranscriptions.NextLink).ConfigureAwait(false);
        }

        // delete all pre-existing completed transcriptions. If transcriptions are still running or not started, they will not be deleted
        foreach (var transcription in paginatedTranscriptions.Values)
        {
            switch (transcription.Status)
            {
                case "Failed":
                case "Succeeded":
                    // we check to see if it was one of the transcriptions we created from this client.
                    if (!createdTranscriptions.Contains(transcription.Self))
                    {
                        // not created form here, continue
                        continue;
                    }

                    completed++;

                    // if the transcription was successful, check the results
                    if (transcription.Status == "Succeeded")
                    {
                        var paginatedfiles = await client.GetTranscriptionFilesAsync(transcription.Links.Files).ConfigureAwait(false);

                        var resultFile = paginatedfiles.Values.FirstOrDefault(f => f.Kind == ArtifactKind.Transcription);
                        var result = await client.GetTranscriptionResultAsync(new Uri(resultFile.Links.ContentUrl)).ConfigureAwait(false);
                        Console.WriteLine("Transcription succeeded. Results: ");
                        Console.WriteLine(JsonConvert.SerializeObject(result, SpeechJsonContractResolver.WriterSettings));
                    }
                    else
                    {
                        Console.WriteLine("Transcription failed. Status: {0}", transcription.Properties.Error.Message);
                    }

                    break;

                case "Running":
                    running++;
                    break;

                case "NotStarted":
                    notStarted++;
                    break;
            }
        }

        // for each transcription in the list we check the status
        Console.WriteLine(string.Format("Transcriptions status: {0} completed, {1} running, {2} not started yet", completed, running, notStarted));
    }
    while (paginatedTranscriptions.NextLink != null);

    // </transcriptionstatus>
    // check again after 1 minute
    await Task.Delay(TimeSpan.FromMinutes(1)).ConfigureAwait(false);
}

Úplné podrobnosti o předchozích voláních najdete v našem dokumentu Swagger. Úplnou ukázku, která je zde zobrazená, GitHub v samples/batch podadresáři .

Tato ukázka používá asynchronní nastavení pro odeslání zvuku a získání stavu přepisu. Metoda PostTranscriptions odešle podrobnosti zvukového souboru a metoda obdrží GetTranscriptions stavy. PostTranscriptions vrátí popisovač a použije ho k vytvoření popisovače pro GetTranscriptions získání stavu přepisu.

Tento vzorový kód nezadá vlastní model. Služba používá k přepisu souboru nebo souborů základní model. Pokud chcete určit model, můžete předat stejnou metodu jako odkaz na model pro vlastní model.

Poznámka

U standardních přepisů nemusíte deklarovat ID pro základní model.

Další kroky