Öğretici: kiracı modeli oluşturma (Önizleme)Tutorial: Create a tenant model (preview)

Kiracı modeli (Microsoft 365 verilerle Özel Konuşma Tanıma), kuruluşunuzun Microsoft 365 verilerinden otomatik olarak özel bir konuşma tanıma modeli üreten Microsoft 365 Kurumsal müşterilere yönelik bir katılım hizmetidir.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. Model, teknik koşullar, jargon ve kişilerin adları için en iyi duruma getirilmiştir, güvenli ve uyumlu bir şekilde yapılır.The model is optimized for technical terms, jargon, and people's names, all in a secure and compliant way.

Önemli

Kuruluşunuz kiracı modeli hizmetini kullanarak kaydolur, konuşma hizmeti kuruluşunuzun dil modeline erişebilir.If your organization enrolls by using the Tenant Model service, Speech Service may access your organization’s language model. Model, kuruluşunuzdaki herkes tarafından görülemeyen Microsoft 365 Genel Grup e-postalarından ve belgelerinden oluşturulur.The model is generated from Microsoft 365 public group emails and documents, which can be seen by anyone in your organization. Kuruluşunuzun Yöneticisi, yönetici portalından kuruluş genelindeki dil modelinin kullanımını açabilir veya kapatabilir.Your organization's admin can turn on or turn off the use of the organization-wide language model from the admin portal.

Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:In this tutorial, you learn how to:

  • Microsoft 365 Yönetim merkezini kullanarak kiracı modeline kaydolmaEnroll in the Tenant Model by using the Microsoft 365 admin center
  • Konuşma aboneliği anahtarı alGet a Speech subscription key
  • Kiracı modeli oluşturmaCreate a tenant model
  • Kiracı modeli dağıtmaDeploy a tenant model
  • Konuşma SDK 'sını kullanarak kiracı modelinizi kullanınUse your tenant model with the Speech SDK

Kiracı model hizmetine kaydolmaEnroll in the Tenant Model service

Kiracı modelinizi dağıtabilmeniz için önce kiracı modeli hizmetine kaydolmuş olmanız gerekir.Before you can deploy your tenant model, you need to be enrolled in the Tenant Model service. Kayıt, Microsoft 365 Yönetim merkezinde tamamlanır ve yalnızca yöneticiniz tarafından yapılabilir.Enrollment is completed in the Microsoft 365 admin center and can be done only by your admin.

  1. Microsoft 365 yönetim merkezinde oturum açın.Sign in to the Microsoft 365 admin center.

  2. Sol bölmede Ayarlar' ı seçin, ardından iç Içe menüsünden Ayarlar ' ı seçin ve ardından Ana penceredeki Azure konuşma Hizmetleri ' ni seçin.In the left pane, select Settings, then select Settings from the nested menu, then select Azure Speech Services from the main window.

    "Hizmetler & eklentileri" bölmesi

  3. Kuruluş genelinde dil modeline Izin ver onay kutusunu seçin ve ardından Değişiklikleri Kaydet' i seçin.Select the Allow the organization-wide language model check box, and then select Save changes.

    Azure konuşma Hizmetleri bölmesi

Kiracı model örneğini devre dışı bırakmak için:To turn off the tenant model instance:

  1. Yukarıdaki 1. ve 2. adımları yineleyin.Repeat the preceding steps 1 and 2.
  2. Kuruluş genelinde dil modeline Izin ver onay kutusunu temizleyin ve ardından Değişiklikleri Kaydet' i seçin.Clear the Allow the organization-wide language model check box, and then select Save changes.

Konuşma aboneliği anahtarı alGet a Speech subscription key

Kiracı modelinizi konuşma SDK 'Sı ile kullanmak için bir konuşma kaynağına ve onunla ilişkili abonelik anahtarına ihtiyacınız vardır.To use your tenant model with the Speech SDK, you need a Speech resource and its associated subscription key.

  1. Azure Portal’ında oturum açın.Sign in to the Azure portal.

  2. Kaynak oluştur’u seçin.Select Create a resource.

  3. Arama kutusuna konuşmayazın.In the Search box, type Speech.

  4. Sonuçlar listesinde konuşma' yı seçin ve ardından Oluştur' u seçin.In the results list, select Speech, and then select Create.

  5. Kaynağı oluşturmak için ekrandaki yönergeleri izleyin.Follow the onscreen instructions to create your resource. Şunlardan emin olun:Make sure that:

    • Konum eastus veya westusolarak ayarlanır.Location is set to either eastus or westus.
    • Fiyatlandırma katmanı S0olarak ayarlanır.Pricing tier is set to S0.
  6. Oluştur’u seçin.Select Create.

    Birkaç dakika sonra kaynağınız oluşturulur.After a few minutes, your resource is created. Abonelik anahtarı, kaynağınızın genel bakış bölümünde bulunabilir.The subscription key is available in the Overview section for your resource.

Dil modeli oluşturmaCreate a language model

Yöneticiniz kuruluşunuz için kiracı modelini etkinleştirdikten sonra, Microsoft 365 verilerinizi temel alan bir dil modeli oluşturabilirsiniz.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. Konuşma Studio'da oturum açın.Sign in to Speech Studio.

  2. Sağ üst köşedeki Ayarlar ' ı (dişli simgesi) seçin ve ardından kiracı modeli ayarları' nı seçin.At the top right, select Settings (gear icon), and then select Tenant Model settings.

    "Kiracı model ayarları" bağlantısı

    Konuşma Studio, kiracı modeli oluşturmak için uygun olup olmadığını bilmenizi sağlayan bir ileti görüntüler.Speech Studio displays a message that lets you know whether you're qualified to create a tenant model.

    Not

    Kuzey Amerika kurumsal müşteriler bir kiracı modeli (Ingilizce) oluşturmaya uygundur.Enterprise customers in North America are eligible to create a tenant model (English). Müşteri Kasası, müşteri anahtarı veya Office 365 Kamu müşterisiyseniz bu özellik kullanılamaz.If you're a Customer Lockbox, Customer Key, or Office 365 Government customer, this feature isn't available. Müşteri Kasası veya müşteri anahtarı müşterisi olup olmadığınızı öğrenmek için bkz.:To determine whether you're a Customer Lockbox or Customer Key customer, see:

  3. Kabul et’i seçin.Select Opt in.

    Kiracı modeliniz hazırlandığınızda, daha fazla yönerge içeren bir onay e-posta iletisi alırsınız.When your tenant model is ready, you'll receive a confirmation email message with further instructions.

Kiracı modelinizi dağıtınDeploy your tenant model

Kiracı modeli örneğiniz hazırlandığınızda, aşağıdakileri yaparak dağıtın:When your tenant model instance is ready, deploy it by doing the following:

  1. Onay e-posta iletinizde modeli görüntüle düğmesini seçin.In your confirmation email message, select the View model button. Veya konuşma Studio'da oturum açın.Or sign in to Speech Studio.

  2. Sağ üst köşedeki Ayarlar ' ı (dişli simgesi) seçin ve ardından kiracı modeli ayarları' nı seçin.At the top right, select Settings (gear icon), and then select Tenant Model settings.

    "Kiracı model ayarları" bağlantısı

  3. Dağıt'ı seçin.Select Deploy.

    Modeliniz dağıtıldığında, durum dağıtıldıolarak değişir.When your model has been deployed, the status changes to Deployed.

Konuşma SDK 'sını kullanarak kiracı modelinizi kullanınUse your tenant model with the Speech SDK

Modelinizi dağıttığınıza göre, artık bunu konuşma SDK 'Sı ile kullanabilirsiniz.Now that you've deployed your model, you can use it with the Speech SDK. Bu bölümde, Azure Active Directory (Azure AD) kimlik doğrulaması kullanarak konuşma hizmetini çağırmak için örnek kod kullanırsınız.In this section, you use sample code to call Speech Service by using Azure Active Directory (Azure AD) authentication.

C# ' de konuşma SDK 'sını çağırmak için kullanacağınız koda göz atalım.Let's look at the code you'll use to call the Speech SDK in C#. Bu örnekte, kiracı modelinizi kullanarak konuşma tanımayı gerçekleştirirsiniz.In this example, you perform speech recognition by using your tenant model. Bu kılavuz, platformunuzun zaten ayarlandığı varsayılır.This guide presumes that your platform is already set up. Kurulum Yardımı 'na ihtiyacınız varsa bkz. hızlı başlangıç: konuşmayı tanıma, C# (.NET Core).If you need setup help, see Quickstart: Recognize speech, C# (.NET Core).

Bu kodu projenize kopyalayın: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;
        }
    }
}

Ardından, komut satırından projeyi yeniden oluşturup çalıştırmanız gerekir.Next, you need to rebuild and run the project from the command line. Komutu çalıştırmadan önce, aşağıdakileri yaparak birkaç parametreyi güncelleştirin:Before you run the command, update a few parameters by doing the following:

  1. <Username>Ve <Password> değerlerini geçerli bir kiracı kullanıcısının değerleriyle değiştirin.Replace <Username> and <Password> with the values for a valid tenant user.

  2. <Subscription-Key>Konuşma kaynağınızın abonelik anahtarıyla değiştirin.Replace <Subscription-Key> with the subscription key for your Speech resource. Bu değer, Azure Portalkonuşma kaynağınızın genel bakış bölümünde bulunur.This value is available in the Overview section for your Speech resource in the Azure portal.

  3. <Endpoint-Uri>Aşağıdaki uç noktayla değiştirin.Replace <Endpoint-Uri> with the following endpoint. ' In {your region} konuşma kaynağınızın oluşturulduğu bölge ile değiştirdiğinizden emin olun.Make sure that you replace {your region} with the region where your Speech resource was created. Bu bölgeler desteklenir: westus , westus2 , ve eastus .These regions are supported: westus, westus2, and eastus. Bölge bilgileriniz, Azure Portalkonuşma kaynağınızın genel bakış bölümünde bulunabilir.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. Şu komutu çalıştırın:Run the following command:

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

Bu öğreticide, özel bir konuşma tanıma modeli oluşturmak, dağıtmak ve konuşma SDK 'Sı ile kullanmak için Microsoft 365 verileri kullanmayı öğrendiniz.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.

Sonraki adımlarNext steps