Batchtranscriptie gebruiken

Batchtranscriptie is een reeks REST API waarmee u een grote hoeveelheid audio in de opslag kunt transcriberen. U kunt naar audiobestanden wijzen met behulp van een typische URI of een SAS-URI (Shared Access Signature) en asynchroon transcriptieresultaten ontvangen. Met de v3.0 API kunt u een of meer audiobestanden transcriberen of een hele opslagcontainer verwerken.

U kunt REST API's voor batchtranscriptie gebruiken om de volgende methoden aan te roepen:

Batchtranscriptiebewerking Methode REST API aanroepen
Hiermee maakt u een nieuwe transcriptie. POST speechtotext/v3.0/transcriptions
Hiermee wordt een lijst met transcripties voor het geverifieerde abonnement opgehaald. GET speechtotext/v3.0/transcriptions
Haalt een lijst met ondersteunde locales op voor offlinetranscripties. GET speechtotext/v3.0/transcriptions/locales
Werkt de veranderlijke details bij van de transcriptie die wordt geïdentificeerd door de id. PATCH speechtotext/v3.0/transcriptions/{id}
Hiermee verwijdert u de opgegeven transcriptietaak. DELETE speechtotext/v3.0/transcriptions/{id}
Haalt de transcriptie op die wordt geïdentificeerd door de opgegeven id. GET speechtotext/v3.0/transcriptions/{id}
Haalt de resultaatbestanden op van de transcriptie die wordt geïdentificeerd door de opgegeven id. GET speechtotext/v3.0/transcriptions/{id}/files

U kunt de gedetailleerde API bekijken en testen, die beschikbaar is als een Swagger-document.

Batchtranscriptietaken worden gepland op basis van best effort. U kunt niet schatten wanneer een taak wordt gewijzigd in de status Wordt uitgevoerd, maar dit zou bij normale systeembelasting binnen enkele minuten moeten gebeuren. Eenmaal in de status Wordt uitgevoerd vindt de transcriptie sneller plaats dan de afspeelsnelheid van de audioruntime.

Vereisten

Net als bij alle functies van de Speech-service maakt u een abonnementssleutel op basis van de Azure Portal de handleiding Aan de slag te volgen.

Notitie

Een standaardabonnement (S0) voor speech-service is vereist voor het gebruik van batchtranscriptie. Gratis abonnementssleutels (F0) werken niet. Zie prijzen en limieten voor meer informatie.

Als u van plan bent om modellen aan te passen, volgt u de stappen in Akoestische aanpassing en Taalaanpassing. Als u de gemaakte modellen wilt gebruiken in batchtranscriptie, hebt u hun modellocatie nodig. U kunt de modellocatie ophalen wanneer u de details van het model (eigenschap) self inspecteert. Er is geen geïmplementeerd aangepast eindpunt nodig voor de batchtranscriptieservice.

Notitie

Als onderdeel van de REST API heeft BatchTranscriptie een set quotaen limieten, die we aansporen om te bekijken. Als u optimaal gebruik wilt maken van batchtranscriptie om een groot aantal audiobestanden efficiënt te transcriberen, raden we u aan altijd meerdere bestanden per aanvraag te verzenden of te wijzen naar een Blob Storage-container met de audiobestanden die u wilt transcriberen. De bestanden worden door de service gelijktijdig transcriberen, waardoor de doorlooptijd wordt verkort. Het gebruik van meerdere bestanden in één aanvraag is heel eenvoudig en eenvoudig. Zie de sectie Configuratie.

API voor batchtranscriptie

De API voor batchtranscriptie ondersteunt de volgende indelingen:

Indeling Codec Bits per voorbeeld Sample Rate
WAV PCM 16-bits 8 kHz of 16 kHz, mono of stereo
MP3 PCM 16-bits 8 kHz of 16 kHz, mono of stereo
OGG OPUS 16-bits 8 kHz of 16 kHz, mono of stereo

Voor stereo-audiostreams worden de linker- en rechterkanalen tijdens de transcriptie gesplitst. Voor elk kanaal wordt een JSON-resultaatbestand gemaakt. Als u een geordende definitieve transcriptie wilt maken, gebruikt u de tijdstempels die per utterance worden gegenereerd.

Configuratie

Configuratieparameters worden geleverd als JSON.

Een of meer afzonderlijke bestanden transcriberen. Als u meer dan één bestand wilt transcriberen, raden we u aan meerdere bestanden in één aanvraag te verzenden. In het onderstaande voorbeeld worden drie bestanden gebruikt:

{
  "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"
}

Een hele opslagcontainer verwerken. Container-SAS moet r machtigingen (lezen) l en (lijst) bevatten:

{
  "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"
}

Gebruik een aangepast getraind model in een batchtranscriptie. In het voorbeeld worden drie bestanden gebruikt:

{
  "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"
}

Configuratie-eigenschappen

Gebruik deze optionele eigenschappen om transcriptie te configureren:

Parameter

Beschrijving

profanityFilterMode

Optioneel, standaard ingesteld op Masked . Hiermee geeft u op hoe grof taalgebruik in herkenningsresultaten moet worden verwerkt. Geaccepteerde waarden zijn het uitschakelen van het filteren van grof taalgebruik, het vervangen van grof taalgebruik door sterretjes, het verwijderen van alle grof taalgebruik uit het resultaat of het toevoegen van tags voor 'grof None Masked Removed Tags taalgebruik'.

punctuationMode

Optioneel, standaard ingesteld op DictatedAndAutomatic . Hiermee geeft u op hoe interpunctie in herkenningsresultaten moet worden verwerkt. Geaccepteerde waarden zijn om leestekens uit te None schakelen, Dictated expliciete (gesproken) interpunctie te impliceren, Automatic om de decoder leestekens te laten gebruiken of om dicteerde en automatische leestekens te DictatedAndAutomatic gebruiken.

wordLevelTimestampsEnabled

falseOptioneel, standaard. Hiermee geeft u op of tijdstempels op woordniveau moeten worden toegevoegd aan de uitvoer.

diarizationEnabled

falseOptioneel, standaard. Hiermee geeft u op dat de analyse van de diarisatie moet worden uitgevoerd op de invoer, die naar verwachting monokanaal met twee stemmen. Opmerking: Hiervoor wordLevelTimestampsEnabled moet worden ingesteld op true .

channels

Optioneel 0 en 1 standaard transcrimineerd. Een matrix met kanaalnummers die moeten worden verwerkt. Hier kan een subset van de beschikbare kanalen in het audiobestand worden opgegeven om te worden verwerkt 0 (bijvoorbeeld alleen).

timeToLive

Optioneel, standaard geen verwijdering. Een duur voor het automatisch verwijderen van transcripties na het voltooien van de transcriptie. De is handig bij het massaal verwerken van transcripties om ervoor te zorgen dat ze uiteindelijk worden timeToLive verwijderd (bijvoorbeeld PT12H 12 uur).

destinationContainerUrl

Optionele URL met ad-hoc SAS naar een be schrijfbare container in Azure. Het resultaat wordt opgeslagen in deze container. SAS met opgeslagen toegangsbeleid wordt niet ondersteund. Wanneer dit niet wordt opgegeven, slaat Microsoft de resultaten op in een opslagcontainer die wordt beheerd door Microsoft. Wanneer de transcriptie wordt verwijderd door Transcriptie verwijderen aan te roepen,worden de resultaatgegevens ook verwijderd.

Storage

Batchtranscriptie kan audio lezen van een openbaar zichtbare internet-URI en kan audio- of schrijftranscripties lezen met behulp van een SAS-URI met Azure Blob Storage.

Resultaat van batchtranscriptie

Voor elke audio-invoer wordt één transcriptieresultaatbestand gemaakt. De bewerking Get transcriptions files retourneert een lijst met resultaatbestanden voor deze transcriptie. Als u het transcriptiebestand voor een specifiek invoerbestand wilt zoeken, filtert u alle geretourneerde bestanden met kind == Transcription en name == {originalInputName.suffix}.json .

Elk transcriptieresultaatbestand heeft deze indeling:

{
  "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
            }
          ]
        }
      ]
    }
  ]
}

Het resultaat bevat de volgende velden:

Veld

Inhoud

lexical

De werkelijke woorden die worden herkend.

itn

Inverse-tekstgenormaliseerde vorm van de herkende tekst. Afkortingen ('arts smith' tot 'dr smith'), telefoonnummers en andere transformaties worden toegepast.

maskedITN

Het ITN-formulier met maskering van grof taalgebruik toegepast.

display

De weergavevorm van de herkende tekst. Leestekens en hoofdletters zijn toegevoegd.

Sprekerscheiding (diarisatie)

Diarisatie is het proces van het scheiden van sprekers in een stuk audio. De batchpijplijn ondersteunt diarisatie en kan twee sprekers op monokanaalopnamen herkennen. De functie is niet beschikbaar op stereo-opnamen.

De uitvoer van transcriptie met ingeschakelde diarisatie bevat een Speaker vermelding voor elke transcribere woordgroep. Als er geen diarisatie wordt gebruikt, Speaker is de eigenschap niet aanwezig in de JSON-uitvoer. Voor diarisatie ondersteunen we twee stemmen, zodat de sprekers worden geïdentificeerd als 1 of 2 .

Als u diarisatie wilt aanvragen, voegt u de eigenschap diarizationEnabled toe op , zoals de true HTTP-aanvraag hieronder wordt weergegeven.

{
  "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"
}

Tijdstempels op wordniveau moeten zijn ingeschakeld zoals de parameters in de bovenstaande aanvraag aangeven.

Aanbevolen procedures

De batchtranscriptieservice kan een groot aantal verzonden transcripties verwerken. U kunt de status van uw transcripties opvragen met Get transcriptions. Roep Delete-transcriptie regelmatig aan vanuit de service zodra u de resultaten hebt opgehaald. U kunt ook de timeToLive eigenschap instellen om ervoor te zorgen dat de resultaten uiteindelijk worden verwijderd.

Tip

U kunt het hulpprogramma Ingestion Client en de resulterende oplossing gebruiken om grote volumes audio te verwerken.

Voorbeeldcode

Volledige voorbeelden zijn beschikbaar in de GitHub voorbeeldopslagplaats in de samples/batch subdirectory.

Werk de voorbeeldcode bij met uw abonnementsgegevens, serviceregio, URI die verwijst naar het audiobestand dat moet worden transcriberen en modellocatie als u een aangepast model gebruikt.

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}");

De voorbeeldcode stelt de client in en verstuurt de transcriptieaanvraag. Vervolgens wordt er naar de statusinformatie gepeild en details over de voortgang van de transcriptie afgedrukt.

// 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);
}

Zie ons Swagger-documentvoor meer informatie over de voorgaande aanroepen. Voor het volledige voorbeeld dat hier wordt weergegeven, gaat u naar GitHub in samples/batch de subdirectory.

In dit voorbeeld wordt een asynchrone installatie gebruikt om audio te posten en de transcriptiestatus te ontvangen. De PostTranscriptions methode verzendt de details van het audiobestand en de methode ontvangt de GetTranscriptions -staten. PostTranscriptions retourneert een -greep en GetTranscriptions gebruikt deze om een greep te maken om de transcriptiestatus op te halen.

Met deze voorbeeldcode wordt geen aangepast model opgegeven. De service gebruikt het basislijnmodel voor het transcriberen van het bestand of de bestanden. Als u het model wilt opgeven, kunt u dezelfde methode doorgeven als de modelverwijzing voor het aangepaste model.

Notitie

Voor basislijntranscripties hoeft u de id voor het basislijnmodel niet te declareeren.

Volgende stappen