Introduzione alla trascrizione della conversazione in tempo reale

L'API ConversationTranscriber di Speech SDK consente di trascrivere riunioni e altre conversazioni con la possibilità di aggiungere, rimuovere e identificare più partecipanti streaming audio al servizio Voce usando PullStream o PushStream . È prima necessario creare firme vocali per ogni partecipante usando l'API REST e quindi usare le firme vocali con l'SDK per trascrivere le conversazioni. Per altre informazioni, vedere La panoramica della trascrizione conversazione.

Limitazioni

  • Disponibile solo nelle aree di sottoscrizione seguenti: centralus , eastasia , eastus , westeurope
  • Richiede una matrice con più microfoni circolare a 7 microfoni. La matrice del microfono deve soddisfare la specifica.
  • Speech Devices SDK offre dispositivi adatti e un'app di esempio che illustra la trascrizione della conversazione.

Prerequisiti

Questo articolo presuppone che si abbia un account Azure e una sottoscrizione del servizio Voce. Se l'account e la sottoscrizione non sono disponibili, provare il servizio Voce gratuitamente.

Installare Speech SDK

Prima di poter eseguire qualsiasi operazione, è necessario installare Speech SDK per JavaScript. A seconda della piattaforma, usare le istruzioni seguenti:

Creare firme vocali

Il primo passaggio consiste nel creare firme vocali per i partecipanti della conversazione in modo che possano essere identificati come relatori univoci. Il .wav file audio di input per la creazione di firme vocali deve essere a 16 bit, frequenza di campionamento a 16 kHz e formato canale singolo (mono). La lunghezza consigliata per ogni campione audio è compresa tra 30 secondi e due minuti. Il .wav file deve essere un esempio di voce di una persona , in modo che venga creato un profilo vocale univoco.

L'esempio seguente illustra come creare una firma vocale usando l'API REST in JavaScript. Si noti che è necessario sostituire le informazioni reali per subscriptionKey , region e il percorso di un file di esempio .wav .

const fs = require('fs');
const axios = require('axios');
const formData = require('form-data');
 
const subscriptionKey = 'your-subscription-key';
const region = 'your-region';
 
async function createProfile() {
    let form = new formData();
    form.append('file', fs.createReadStream('path-to-voice-sample.wav'));
    let headers = form.getHeaders();
    headers['Ocp-Apim-Subscription-Key'] = subscriptionKey;
 
    let url = `https://signature.${region}.cts.speech.microsoft.com/api/v1/Signature/GenerateVoiceSignatureFromFormData`;
    let response = await axios.post(url, form, { headers: headers });
    
    // get signature from response, serialize to json string
    return JSON.stringify(response.data.Signature);
}
 
async function main() {
    // use this voiceSignature string with conversation transcription calls below
    let voiceSignatureString = await createProfile();
    console.log(voiceSignatureString);
}
main();

L'esecuzione di questo script restituisce una stringa di firma vocale nella variabile voiceSignatureString . Eseguire la funzione due volte per avere due stringhe da usare come input per le variabili voiceSignatureStringUser1 e voiceSignatureStringUser2 sotto.

Nota

È possibile creare firme vocali solo usando l'API REST.

Trascrizione di conversazioni

Nell'esempio di codice seguente viene illustrato come trascrivere le conversazioni in tempo reale per due relatori. Si presuppone che siano già state create stringhe di firma vocale per ogni altoparlante, come illustrato in precedenza. Sostituire le informazioni reali per subscriptionKey , region e il percorso dell' filepath audio che si vuole trascrivere.

Questo codice di esempio esegue le operazioni seguenti:

  • Consente di creare un flusso push da utilizzare per la trascrizione e di scrivervi il .wav file di esempio.
  • Crea un oggetto Conversation utilizzando createConversationAsync() .
  • Crea un oggetto ConversationTranscriber usando il costruttore.
  • Aggiunge i partecipanti alla conversazione. Le stringhe voiceSignatureStringUser1 e voiceSignatureStringUser2 dovrebbero essere come output dei passaggi precedenti.
  • Registra gli eventi e inizia la trascrizione.
(function() {
    "use strict";
    var sdk = require("microsoft-cognitiveservices-speech-sdk");
    var fs = require("fs");
    
    var subscriptionKey = "your-subscription-key";
    var region = "your-region";
    var filepath = "audio-file-to-transcribe.wav"; // 8-channel audio
    
    // create the push stream and write file to it
    var pushStream = sdk.AudioInputStream.createPushStream();
    fs.createReadStream(filepath).on('data', function(arrayBuffer) {
        pushStream.write(arrayBuffer.slice());
    }).on('end', function() {
        pushStream.close();
    });
    
    var speechTranslationConfig = sdk.SpeechTranslationConfig.fromSubscription(subscriptionKey, region);
    var audioConfig = sdk.AudioConfig.fromStreamInput(pushStream);
    speechTranslationConfig.speechRecognitionLanguage = "en-US";
    
    // create conversation and transcriber
    var conversation = sdk.Conversation.createConversationAsync(speechTranslationConfig, "myConversation");
    var transcriber = new sdk.ConversationTranscriber(audioConfig);
    
    // attach the transcriber to the conversation
    transcriber.joinConversationAsync(conversation,
    function () {
        // add first participant using voiceSignature created in enrollment step
        var user1 = sdk.Participant.From("user1@example.com", "en-us", voiceSignatureStringUser1);
        conversation.addParticipantAsync(user1,
        function () {
            // add second participant using voiceSignature created in enrollment step
            var user2 = sdk.Participant.From("user2@example.com", "en-us", voiceSignatureStringUser2);
            conversation.addParticipantAsync(user2,
            function () {
                transcriber.sessionStarted = function(s, e) {
                console.log("(sessionStarted)");
                };
                transcriber.sessionStopped = function(s, e) {
                console.log("(sessionStopped)");
                };
                transcriber.canceled = function(s, e) {
                console.log("(canceled)");
                };
                transcriber.transcribed = function(s, e) {
                console.log("(transcribed) text: " + e.result.text);
                console.log("(transcribed) speakerId: " + e.result.speakerId);
                };
    
                // begin conversation transcription
                transcriber.startTranscribingAsync(
                function () { },
                function (err) {
                    console.trace("err - starting transcription: " + err);
                });
        },
        function (err) {
            console.trace("err - adding user1: " + err);
        });
    },
    function (err) {
        console.trace("err - adding user2: " + err);
    });
    },
    function (err) {
    console.trace("err - " + err);
    });
}()); 

Installare Speech SDK

Prima di poter eseguire qualsiasi operazione, è necessario installare Speech SDK. A seconda della piattaforma, usare le istruzioni seguenti:

Creare firme vocali

Il primo passaggio consiste nel creare firme vocali per i partecipanti alla conversazione in modo che possano essere identificati come parlanti univoci. Il file audio di input per la creazione di firme vocali deve essere a .wav 16 bit, frequenza di campionamento a 16 kHz e formato a canale singolo (mono). La lunghezza consigliata per ogni campione audio è compresa tra 30 secondi e due minuti. Il file deve essere un esempio della voce di una persona .wav in modo da creare un profilo vocale univoco.

L'esempio seguente illustra come creare una firma vocale usando l'API REST in C# . Si noti che è necessario sostituire le informazioni reali con subscriptionKey , e il percorso di un file di region .wav esempio.

using System;
using System.IO;
using System.Net.Http;
using System.Runtime.Serialization;
using System.Threading.Tasks;
using Newtonsoft.Json;

[DataContract]
internal class VoiceSignature
{
    [DataMember]
    public string Status { get; private set; }

    [DataMember]
    public VoiceSignatureData Signature { get; private set; }

    [DataMember]
    public string Transcription { get; private set; }
}

[DataContract]
internal class VoiceSignatureData
{
    internal VoiceSignatureData()
    { }

    internal VoiceSignatureData(int version, string tag, string data)
    {
        this.Version = version;
        this.Tag = tag;
        this.Data = data;
    }

    [DataMember]
    public int Version { get; private set; }

    [DataMember]
    public string Tag { get; private set; }

    [DataMember]
    public string Data { get; private set; }
}

private static async Task<string> GetVoiceSignatureString()
{
    var subscriptionKey = "your-subscription-key";
    var region = "your-region";

    byte[] fileBytes = File.ReadAllBytes("path-to-voice-sample.wav");
    var content = new ByteArrayContent(fileBytes);
    var client = new HttpClient();
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
    var response = await client.PostAsync($"https://signature.{region}.cts.speech.microsoft.com/api/v1/Signature/GenerateVoiceSignatureFromByteArray", content);
    
    var jsonData = await response.Content.ReadAsStringAsync();
    var result = JsonConvert.DeserializeObject<VoiceSignature>(jsonData);
    return JsonConvert.SerializeObject(result.Signature);
}

L'esecuzione della GetVoiceSignatureString() funzione restituisce una stringa di firma vocale nel formato corretto. Eseguire la funzione due volte in modo da avere due stringhe da usare come input per le variabili voiceSignatureStringUser1 e di voiceSignatureStringUser2 seguito.

Nota

Le firme vocali possono essere create solo usando l'API REST.

Trascrivere le conversazioni

Il codice di esempio seguente illustra come trascrivere le conversazioni in tempo reale per due parlanti. Presuppone che siano già state create stringhe di firma vocale per ogni altoparlante, come illustrato in precedenza. Sostituire le informazioni reali per subscriptionKey , e il percorso per region filepath l'audio da trascrivere.

Questo codice di esempio esegue le operazioni seguenti:

  • Crea un AudioConfig oggetto dal file di esempio da .wav trascrivere.
  • Crea un Conversation oggetto utilizzando CreateConversationAsync() .
  • Crea un ConversationTranscriber oggetto utilizzando il costruttore e sottoscrive gli eventi necessari.
  • Aggiunge i partecipanti alla conversazione. Le stringhe voiceSignatureStringUser1 e voiceSignatureStringUser2 devono essere restituite come output dai passaggi precedenti della funzione GetVoiceSignatureString() .
  • Unisce la conversazione e inizia la trascrizione.

Chiamare la funzione TranscribeConversationsAsync() per avviare la trascrizione della conversazione.

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
using Microsoft.CognitiveServices.Speech.Transcription;

class transcribe_conversation
{
// all your other code

public static async Task TranscribeConversationsAsync(string voiceSignatureStringUser1, string voiceSignatureStringUser2)
{
    var subscriptionKey = "your-subscription-key";
    var region = "your-region";
    var filepath = "audio-file-to-transcribe.wav";

    var config = SpeechConfig.FromSubscription(subscriptionKey, region);
    config.SetProperty("ConversationTranscriptionInRoomAndOnline", "true");
    var stopRecognition = new TaskCompletionSource<int>();

    using (var audioInput = AudioConfig.FromWavFileInput(filepath))
    {
        var meetingID = Guid.NewGuid().ToString();
        using (var conversation = await Conversation.CreateConversationAsync(config, meetingID))
        {
            // create a conversation transcriber using audio stream input
            using (var conversationTranscriber = new ConversationTranscriber(audioInput))
            {
                conversationTranscriber.Transcribing += (s, e) =>
                {
                    Console.WriteLine($"TRANSCRIBING: Text={e.Result.Text} SpeakerId={e.Result.UserId}");
                };

                conversationTranscriber.Transcribed += (s, e) =>
                {
                    if (e.Result.Reason == ResultReason.RecognizedSpeech)
                    {
                        Console.WriteLine($"TRANSCRIBED: Text={e.Result.Text} SpeakerId={e.Result.UserId}");
                    }
                    else if (e.Result.Reason == ResultReason.NoMatch)
                    {
                        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
                    }
                };

                conversationTranscriber.Canceled += (s, e) =>
                {
                    Console.WriteLine($"CANCELED: Reason={e.Reason}");

                    if (e.Reason == CancellationReason.Error)
                    {
                        Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}");
                        Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
                        Console.WriteLine($"CANCELED: Did you update the subscription info?");
                        stopRecognition.TrySetResult(0);
                    }
                };

                conversationTranscriber.SessionStarted += (s, e) =>
                {
                    Console.WriteLine($"\nSession started event. SessionId={e.SessionId}");
                };

                conversationTranscriber.SessionStopped += (s, e) =>
                {
                    Console.WriteLine($"\nSession stopped event. SessionId={e.SessionId}");
                    Console.WriteLine("\nStop recognition.");
                    stopRecognition.TrySetResult(0);
                };

                // Add participants to the conversation.
                var speaker1 = Participant.From("User1", "en-US", voiceSignatureStringUser1);
                var speaker2 = Participant.From("User2", "en-US", voiceSignatureStringUser2);
                await conversation.AddParticipantAsync(speaker1);
                await conversation.AddParticipantAsync(speaker2);

                // Join to the conversation and start transcribing
                await conversationTranscriber.JoinConversationAsync(conversation);
                await conversationTranscriber.StartTranscribingAsync().ConfigureAwait(false);

                // waits for completion, then stop transcription
                Task.WaitAny(new[] { stopRecognition.Task });
                await conversationTranscriber.StopTranscribingAsync().ConfigureAwait(false);
            }
        }
    }
}
}

Passaggi successivi