Esercitazione: Creare un modello di tenant (anteprima)Tutorial: Create a tenant model (preview)

Il modello di tenant (Riconoscimento vocale personalizzato con dati di Microsoft 365) è un servizio basato su consenso esplicito per i clienti aziendali di Microsoft 365 che genera automaticamente un modello di riconoscimento vocale personalizzato dai dati di Microsoft 365 dell'organizzazione.Tenant Model (Custom Speech with Microsoft 365 data) is an opt-in service for Microsoft 365 enterprise customers that automatically generates a custom speech recognition model from your organization's Microsoft 365 data. Il modello è ottimizzato per termini tecnici, gergo e nomi di persone, in modo sicuro e conforme.The model is optimized for technical terms, jargon, and people's names, all in a secure and compliant way.

Importante

Se l'organizzazione si registra usando il servizio del modello di tenant, il servizio Voce potrebbe accedere al suo modello linguistico.If your organization enrolls by using the Tenant Model service, Speech Service may access your organization’s language model. Il modello viene generato dai messaggi di posta elettronica e dai documenti dei gruppi pubblici di Microsoft 365, che sono visibili a chiunque nell'organizzazione.The model is generated from Microsoft 365 public group emails and documents, which can be seen by anyone in your organization. L'amministratore dell'organizzazione può attivare o disattivare l'uso del modello linguistico a livello di organizzazione tramite il portale di amministrazione.Your organization's admin can turn on or turn off the use of the organization-wide language model from the admin portal.

In questa esercitazione verranno illustrate le procedure per:In this tutorial, you learn how to:

  • Eseguire la registrazione nel modello di tenant tramite l'interfaccia di amministrazione di Microsoft 365Enroll in the Tenant Model by using the Microsoft 365 admin center
  • Ottenere una chiave di sottoscrizione al servizio VoceGet a Speech subscription key
  • Creare un modello di tenantCreate a tenant model
  • Distribuire un modello di tenantDeploy a tenant model
  • Usare il modello di tenant con Speech SDKUse your tenant model with the Speech SDK

Eseguire la registrazione nel servizio del modello di tenantEnroll in the Tenant Model service

Prima di distribuire il modello di tenant, è necessario eseguire la registrazione nel relativo servizio.Before you can deploy your tenant model, you need to be enrolled in the Tenant Model service. La registrazione viene completata nell'interfaccia di amministrazione di Microsoft 365 e può essere eseguita solo dall'amministratore.Enrollment is completed in the Microsoft 365 admin center and can be done only by your admin.

  1. Accedere all'interfaccia di amministrazione di Microsoft 365.Sign in to the Microsoft 365 admin center.

  2. Nel riquadro sinistro selezionare Impostazioni, quindi selezionare Impostazioni dal menu nidificato, infine selezionare i servizi vocali di Azure dalla finestra principale.In the left pane, select Settings, then select Settings from the nested menu, then select Azure Speech Services from the main window.

    Riquadro "Servizi e componenti aggiuntivi"

  3. Selezionare la casella di controllo Consenti il modello linguistico dell'organizzazione e quindi selezionare Salva modifiche.Select the Allow the organization-wide language model check box, and then select Save changes.

    Riquadro Azure Speech Services

Per disattivare l'istanza del modello di tenant:To turn off the tenant model instance:

  1. Ripetere i precedenti passaggi 1 e 2.Repeat the preceding steps 1 and 2.
  2. Deselezionare la casella di controllo Consenti il modello linguistico dell'organizzazione e quindi selezionare Salva modifiche.Clear the Allow the organization-wide language model check box, and then select Save changes.

Ottenere una chiave di sottoscrizione al servizio VoceGet a Speech subscription key

Per usare il modello di tenant con Speech SDK, è necessario avere una risorsa Voce e la chiave di sottoscrizione associata.To use your tenant model with the Speech SDK, you need a Speech resource and its associated subscription key.

  1. Accedere al portale di Azure.Sign in to the Azure portal.

  2. Selezionare Crea una risorsa.Select Create a resource.

  3. Nella casella Cerca digitare Voce.In the Search box, type Speech.

  4. Nell'elenco dei risultati selezionare Voce e quindi Crea.In the results list, select Speech, and then select Create.

  5. Seguire le istruzioni visualizzate per creare la risorsa.Follow the onscreen instructions to create your resource. Assicurarsi che:Make sure that:

    • L'opzione Località deve essere impostata su eastus o westus.Location is set to either eastus or westus.
    • L'opzione Piano tariffario deve essere impostata su S0.Pricing tier is set to S0.
  6. Selezionare Crea.Select Create.

    Dopo alcuni minuti, la risorsa viene creata.After a few minutes, your resource is created. La chiave di sottoscrizione è disponibile nella sezione Panoramica relativa alla risorsa.The subscription key is available in the Overview section for your resource.

Creare un modello linguisticoCreate a language model

Dopo che l'amministratore ha abilitato il modello di tenant per l'organizzazione, è possibile creare un modello linguistico basato sui dati di Microsoft 365.After your admin has enabled Tenant Model for your organization, you can create a language model that's based on your Microsoft 365 data.

  1. Accedere a Speech Studio.Sign in to Speech Studio.

  2. Nell'angolo in alto a destra selezionare Impostazioni (icona dell'ingranaggio) e quindi Tenant Model settings (Impostazioni modello di tenant).At the top right, select Settings (gear icon), and then select Tenant Model settings.

    Collegamento "Tenant Model settings"

    Speech Studio visualizza un messaggio che informa se si è idonei a creare un modello di tenant.Speech Studio displays a message that lets you know whether you're qualified to create a tenant model.

    Nota

    I clienti aziendali in America del Nord sono idonei per la creazione di un modello di tenant (inglese).Enterprise customers in North America are eligible to create a tenant model (English). Per i clienti di Customer Lockbox, Customer Key o Office 365 Government, questa funzionalità non è disponibile.If you're a Customer Lockbox, Customer Key, or Office 365 Government customer, this feature isn't available. Per determinare se si è un cliente di Customer Lockbox o Customer Key, vedere:To determine whether you're a Customer Lockbox or Customer Key customer, see:

  3. Selezionare Acconsenti esplicitamente .Select Opt in.

    Quando il modello di tenant è pronto, si riceverà un messaggio di posta elettronica di conferma con ulteriori istruzioni.When your tenant model is ready, you'll receive a confirmation email message with further instructions.

Distribuire il modello di tenantDeploy your tenant model

Quando l'istanza del modello di tenant è pronta, eseguire questa procedura per distribuirla:When your tenant model instance is ready, deploy it by doing the following:

  1. Nel messaggio di posta elettronica di conferma selezionare il pulsante View model (Visualizza modello).In your confirmation email message, select the View model button. In alternativa, accedere a Speech Studio.Or sign in to Speech Studio.

  2. Nell'angolo in alto a destra selezionare Impostazioni (icona dell'ingranaggio) e quindi Tenant Model settings (Impostazioni modello di tenant).At the top right, select Settings (gear icon), and then select Tenant Model settings.

    Collegamento "Tenant Model settings"

  3. Selezionare Distribuisci.Select Deploy.

    Dopo che il modello è stato distribuito, lo stato cambia in Distribuito.When your model has been deployed, the status changes to Deployed.

Usare il modello di tenant con Speech SDKUse your tenant model with the Speech SDK

Ora che è stato distribuito il modello, è possibile usarlo con Speech SDK.Now that you've deployed your model, you can use it with the Speech SDK. In questa sezione viene usato un codice di esempio per chiamare il servizio Voce usando l'autenticazione di Azure Active Directory (Azure AD).In this section, you use sample code to call Speech Service by using Azure Active Directory (Azure AD) authentication.

Verrà ora esaminato il codice che verrà usato per chiamare Speech SDK in C#.Let's look at the code you'll use to call the Speech SDK in C#. In questo esempio si esegue il riconoscimento vocale usando il modello di tenant.In this example, you perform speech recognition by using your tenant model. Questa guida presuppone che la piattaforma sia già configurata.This guide presumes that your platform is already set up. Se è necessaria assistenza per la configurazione, vedere Avvio rapido: Riconoscimento vocale, C# (.NET Core).If you need setup help, see Quickstart: Recognize speech, C# (.NET Core).

Copiare questo codice nel progetto:Copy this code into your project:

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

Quindi è necessario ricompilare ed eseguire il progetto dalla riga di comando.Next, you need to rebuild and run the project from the command line. Prima di eseguire il comando, aggiornare alcuni parametri eseguendo questa procedura:Before you run the command, update a few parameters by doing the following:

  1. Sostituire <Username> e <Password> con i valori di un utente tenant valido.Replace <Username> and <Password> with the values for a valid tenant user.

  2. Sostituire <Subscription-Key> con la chiave di sottoscrizione della risorsa di riconoscimento vocale.Replace <Subscription-Key> with the subscription key for your Speech resource. Questo valore è disponibile nella sezione Panoramica relativa alla risorsa di riconoscimento vocale nel portale di Azure.This value is available in the Overview section for your Speech resource in the Azure portal.

  3. Sostituire <Endpoint-Uri> con l'endpoint seguente.Replace <Endpoint-Uri> with the following endpoint. Assicurarsi di sostituire {your region} con l'area in cui è stata creata la risorsa di riconoscimento vocale.Make sure that you replace {your region} with the region where your Speech resource was created. Sono supportate queste aree: westus, westus2 e eastus.These regions are supported: westus, westus2, and eastus. Le informazioni sull'area sono disponibili nella sezione Panoramica della risorsa Voce nel portale di Azure.Your region information is available in the Overview section of your Speech resource in the Azure portal.

    "wss://{your region}.online.princeton.customspeech.ai/msgraphcustomspeech/conversation/v1".
    
  4. Eseguire il comando seguente:Run the following command:

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

In questa esercitazione si è appreso come usare i dati di Microsoft 365 per creare un modello di riconoscimento vocale personalizzato, distribuirlo e usarlo con Speech SDK.In this tutorial, you've learned how to use Microsoft 365 data to create a custom speech recognition model, deploy it, and use it with the Speech SDK.

Passaggi successiviNext steps