Självstudie: Skapa en klientmodell (förhandsversion)

Klientorganisationsmodell (anpassat tal med Microsoft 365-data) är en tjänst som Microsoft 365 Enterprise-kunder kan anmäla sig till och som automatiskt genererar en anpassad taligenkänningsmodell från din organisations Microsoft 365-data. Modellen är optimerad för tekniska termer, jargong och personers namn, och allt hanteras på ett säkert sätt.

Viktigt

Om din organisation registrerar sig med hjälp av klientmodelltjänsten kan Speech Service komma åt organisationens språkmodell. Modellen genereras från en Microsoft 365 e-post och dokument för offentliga grupper, som kan ses av alla i din organisation. Din organisations administratör kan aktivera eller inaktivera användningen av den organisationsomfattande språkmodellen från administratörsportalen.

I den här guiden får du lära dig att:

  • Registrera i klientorganisationsmodellen med hjälp av Administrationscenter för Microsoft 365
  • Hämta en Speech-prenumerationsnyckel
  • Skapa en klientmodell
  • Distribuera en klientmodell
  • Använda din klientmodell med Speech SDK

Registrera i klientmodelltjänsten

Innan du kan distribuera din klientmodell måste du vara registrerad i klientmodelltjänsten. Registreringen slutförs i Administrationscenter för Microsoft 365 och kan bara göras av din administratör.

  1. Logga in på Administrationscenter för Microsoft 365.

  2. I den vänstra rutan väljer Inställningar, välj sedan Inställningar på den kapslade menyn och välj sedan Azure Speech Services från huvudfönstret.

    Fönstret "&-tillägg"

  3. Markera kryssrutan Tillåt språkmodellen för hela organisationen och välj sedan Spara ändringar.

    Fönstret Azure Speech Services

Så här stänger du av klientmodellinstansen:

  1. Upprepa föregående steg 1 och 2.
  2. Avmarkera kryssrutan Tillåt språkmodellen för hela organisationen och välj sedan Spara ändringar.

Hämta en Speech-prenumerationsnyckel

Om du vill använda din klientmodell med Speech SDK behöver du en Speech-resurs och dess associerade prenumerationsnyckel.

  1. Logga in på Azure-portalen.

  2. Välj Skapa en resurs.

  3. I rutan Sök skriver du Speech.

  4. I resultatlistan väljer du Tal och sedan Skapa.

  5. Följ anvisningarna på skärmen för att skapa din resurs. Se till att:

    • Platsen anges till antingen eastus eller westus.
    • Prisnivån är inställd på S0.
  6. Välj Skapa.

    Efter några minuter skapas resursen. Prenumerationsnyckeln finns i avsnittet Översikt för din resurs.

Skapa en språkmodell

När administratören har aktiverat klientmodell för din organisation kan du skapa en språkmodell som baseras på dina Microsoft 365 data.

  1. Logga in på Speech Studio.

  2. Längst upp till höger väljer Inställningar (kugghjulsikonen) och sedan Inställningar för klientmodell.

    Länken "Inställningar för klientmodell"

    Speech Studio visar ett meddelande som anger om du är kvalificerad att skapa en klientmodell.

    Anteckning

    Företagskunder i Nordamerika berättigade att skapa en klientmodell (engelska). Om du är en Customer Lockbox, kundnyckel eller Office 365 för myndigheter kund är den här funktionen inte tillgänglig. Om du vill ta reda på om du är Customer Lockbox kund eller kundnyckel kan du se:

  3. Välj Anmäl dig.

    När din klientmodell är klar får du ett e-postmeddelande med bekräftelse med ytterligare instruktioner.

Distribuera din klientmodell

När din klientmodellinstans är klar distribuerar du den genom att göra följande:

  1. I bekräftelsemeddelandet väljer du knappen Visa modell. Eller logga in på Speech Studio.

  2. Längst upp till höger väljer Inställningar (kugghjulsikonen) och sedan Inställningar för klientmodell.

    Länken "Inställningar för klientmodell"

  3. Välj Distribuera.

    När din modell har distribuerats ändras statusen till Distribuerad.

Använda din klientmodell med Speech SDK

Nu när du har distribuerat din modell kan du använda den med Speech SDK. I det här avsnittet använder du exempelkod för att anropa Speech Service med hjälp av Azure Active Directory -autentisering (Azure AD).

Nu ska vi titta på den kod som du använder för att anropa Speech SDK i C#. I det här exemplet utför du taligenkänning med hjälp av din klientmodell. Den här guiden förutsätter att din plattform redan har ställts in. Om du behöver installationshjälp kan du gå till Snabbstart: Identifiera tal, C# (.NET Core).

Kopiera den här koden till projektet:

namespace PrincetonSROnly.FrontEnd.Samples
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net.Http;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    using Microsoft.CognitiveServices.Speech;
    using Microsoft.CognitiveServices.Speech.Audio;
    using Microsoft.IdentityModel.Clients.ActiveDirectory;
    using Newtonsoft.Json.Linq;

    // ServiceApplicationId is a fixed value. No need to change it.

    public class TenantLMSample
    {
        private const string EndpointUriArgName = "EndpointUri";
        private const string SubscriptionKeyArgName = "SubscriptionKey";
        private const string UsernameArgName = "Username";
        private const string PasswordArgName = "Password";
        private const string ClientApplicationId = "f87bc118-1576-4097-93c9-dbf8f45ef0dd";
        private const string ServiceApplicationId = "18301695-f99d-4cae-9618-6901d4bdc7be";

        public static async Task ContinuousRecognitionWithTenantLMAsync(Uri endpointUri, string subscriptionKey, string audioDirPath, string username, string password)
        {
            var config = SpeechConfig.FromEndpoint(endpointUri, subscriptionKey);

            // Passing client specific information for obtaining LM
            if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password))
            {
                config.AuthorizationToken = await AcquireAuthTokenWithInteractiveLoginAsync().ConfigureAwait(false);
            }
            else
            {
                config.AuthorizationToken = await AcquireAuthTokenWithUsernamePasswordAsync(username, password).ConfigureAwait(false);
            }

            var stopRecognition = new TaskCompletionSource<int>();

            // Creates a speech recognizer using file as audio input.
            // Replace with your own audio file name.
            using (var audioInput = AudioConfig.FromWavFileInput(audioDirPath))
            {
                using (var recognizer = new SpeechRecognizer(config, audioInput))
                {
                    // Subscribes to events
                    recognizer.Recognizing += (s, e) =>
                    {
                        Console.WriteLine($"RECOGNIZING: Text={e.Result.Text}");
                    };

                    recognizer.Recognized += (s, e) =>
                    {
                        if (e.Result.Reason == ResultReason.RecognizedSpeech)
                        {
                            Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
                        }
                        else if (e.Result.Reason == ResultReason.NoMatch)
                        {
                            Console.WriteLine($"NOMATCH: Speech could not be recognized.");
                        }
                    };

                    recognizer.Canceled += (s, e) =>
                    {
                        Console.WriteLine($"CANCELED: Reason={e.Reason}");
                        if (e.Reason == CancellationReason.Error)
                        {
                            Exception exp = new Exception(string.Format("Error Code: {0}\nError Details{1}\nIs your subscription information updated?", e.ErrorCode, e.ErrorDetails));
                            throw exp;
                        }

                        stopRecognition.TrySetResult(0);
                    };

                    recognizer.SessionStarted += (s, e) =>
                    {
                        Console.WriteLine("\n    Session started event.");
                    };

                    recognizer.SessionStopped += (s, e) =>
                    {
                        Console.WriteLine("\n    Session stopped event.");
                        Console.WriteLine("\nStop recognition.");
                        stopRecognition.TrySetResult(0);
                    };

                    // Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
                    await recognizer.StartContinuousRecognitionAsync().ConfigureAwait(false);

                    // Waits for completion.
                    // Use Task.WaitAny to keep the task rooted.
                    Task.WaitAny(new[] { stopRecognition.Task });

                    // Stops recognition.
                    await recognizer.StopContinuousRecognitionAsync().ConfigureAwait(false);
                }
            }
        }

        public static void Main(string[] args)
        {
            var arguments = new Dictionary<string, string>();
            string inputArgNamePattern = "--";
            Regex regex = new Regex(inputArgNamePattern);
            if (args.Length > 0)
            {
                foreach (var arg in args)
                {
                    var userArgs = arg.Split("=");
                    arguments[regex.Replace(userArgs[0], string.Empty)] = userArgs[1];
                }
            }

            var endpointString = arguments.GetValueOrDefault(EndpointUriArgName, $"wss://westus.online.princeton.customspeech.ai/msgraphcustomspeech/conversation/v1");
            var endpointUri = new Uri(endpointString);

            if (!arguments.ContainsKey(SubscriptionKeyArgName))
            {
                Exception exp = new Exception("Subscription Key missing! Please pass in a Cognitive services subscription Key using --SubscriptionKey=\"your_subscription_key\"" +
                    "Find more information on creating a Cognitive services resource and accessing your Subscription key here: https://docs.microsoft.com/azure/cognitive-services/cognitive-services-apis-create-account?tabs=multiservice%2Cwindows");
                throw exp;
            }

            var subscriptionKey = arguments[SubscriptionKeyArgName];
            var username = arguments.GetValueOrDefault(UsernameArgName, null);
            var password = arguments.GetValueOrDefault(PasswordArgName, null);

            var audioDirPath = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "../../../AudioSamples/DictationBatman.wav");
            if (!File.Exists(audioDirPath))
            {
                Exception exp = new Exception(string.Format("Audio File does not exist at path: {0}", audioDirPath));
                throw exp;
            }

            ContinuousRecognitionWithTenantLMAsync(endpointUri, subscriptionKey, audioDirPath, username, password).GetAwaiter().GetResult();
        }

        private static async Task<string> AcquireAuthTokenWithUsernamePasswordAsync(string username, string password)
        {
            var tokenEndpoint = "https://login.microsoftonline.com/common/oauth2/token";
            var postBody = $"resource={ServiceApplicationId}&client_id={ClientApplicationId}&grant_type=password&username={username}&password={password}";
            var stringContent = new StringContent(postBody, Encoding.UTF8, "application/x-www-form-urlencoded");
            using (HttpClient httpClient = new HttpClient())
            {
                var response = await httpClient.PostAsync(tokenEndpoint, stringContent).ConfigureAwait(false);

                if (response.IsSuccessStatusCode)
                {
                    var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                    JObject jobject = JObject.Parse(result);
                    return jobject["access_token"].Value<string>();
                }
                else
                {
                    throw new Exception($"Requesting token from {tokenEndpoint} failed with status code {response.StatusCode}: {await response.Content.ReadAsStringAsync().ConfigureAwait(false)}");
                }
            }
        }

        private static async Task<string> AcquireAuthTokenWithInteractiveLoginAsync()
        {
            var authContext = new AuthenticationContext("https://login.windows.net/microsoft.onmicrosoft.com");
            var deviceCodeResult = await authContext.AcquireDeviceCodeAsync(ServiceApplicationId, ClientApplicationId).ConfigureAwait(false);

            Console.WriteLine(deviceCodeResult.Message);

            var authResult = await authContext.AcquireTokenByDeviceCodeAsync(deviceCodeResult).ConfigureAwait(false);

            return authResult.AccessToken;
        }
    }
}

Därefter måste du återskapa och köra projektet från kommandoraden. Innan du kör kommandot uppdaterar du några parametrar genom att göra följande:

  1. Ersätt <Username> och med värdena för en giltig <Password> klientanvändare.

  2. Ersätt <Subscription-Key> med prenumerationsnyckeln för din Speech-resurs. Det här värdet är tillgängligt i avsnittet Översikt för talresursen i Azure Portal.

  3. Ersätt <Endpoint-Uri> med följande slutpunkt. Se till att du {your region} ersätter med den region där speech-resursen skapades. Dessa regioner stöds: westus , westus2 och eastus . Regioninformationen finns i avsnittet Översikt för talresursen i Azure Portal.

    "wss://{your region}.online.princeton.customspeech.ai/msgraphcustomspeech/conversation/v1".
    
  4. Kör följande kommando:

    dotnet TenantLMSample.dll --Username=<Username> --Password=<Password> --SubscriptionKey=<Subscription-Key> --EndpointUri=<Endpoint-Uri>
    

I den här självstudien har du lärt dig hur du använder Microsoft 365 för att skapa en anpassad taligenkänningsmodell, distribuera den och använda den med Speech SDK.

Nästa steg