Öğretici: Kiracı modeli oluşturma (önizleme)
Kiracı Modeli (Microsoft 365 verilerle Özel Konuşma), Microsoft 365 kurumsal müşterileri için, otomatik olarak kuruluş verilerinden özel bir konuşma tanıma modeli oluşturan bir Microsoft 365 hizmetidir. Model, teknik terimler, jargon ve kişi adları için güvenli ve uyumlu bir şekilde en iyi duruma getirildi.
Önemli
Kurum, Kiracı Modeli hizmetini kullanarak kaydolıyorsa Konuşma Tanıma Hizmeti, kuruluş dil modeline erişe bir hizmettir. Model, genel Microsoft 365 e-postalarından ve belgelerinden oluşturulur ve bu, kuruluşta herkes tarafından görülebilir. Kuruluş yöneticiniz, yönetim portalında kuruluş genelindeki dil modelinin kullanımını aç veya kapatabilirsiniz.
Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:
- Kiracı Modeli'ne kaydolmak için Microsoft 365 yönetim merkezi
- Konuşma abonelik anahtarı alma
- Kiracı modeli oluşturma
- Kiracı modeli dağıtma
- Konuşma SDK'sı ile kiracı modelinizi kullanma
Kiracı Modeli hizmetine kaydolma
Kiracı modelinizi dağıtamadan önce Kiracı Modeli hizmetine kaydolmanız gerekir. Kayıt işlemi Microsoft 365 yönetim merkezi yalnızca yöneticiniz tarafından yapılabilir.
Microsoft 365 yönetim merkezinde oturum açın.
Sol bölmede, Ayarlar'ı ve ardından iç içe Ayarlar seçin ve sonra da ana pencereden Azure Konuşma Hizmetleri'ni seçin.

Kuruluş genelinde dil modeline izin ver onay kutusunu ve ardından Değişiklikleri kaydet'i seçin.

Kiracı modeli örneğini kapatmak için:
- Yukarıdaki 1. ve 2. adımları tekrarlayın.
- Kuruluş genelinde dil modeline izin ver onay kutusunun işaretini kaldırın ve değişiklikleri kaydet'i seçin.
Konuşma abonelik anahtarı alma
Konuşma SDK'sı ile kiracı modelinizi kullanmak için bir Konuşma kaynağına ve ilişkili abonelik anahtarına ihtiyacınız vardır.
Azure portalında oturum açın.
Kaynak oluştur’u seçin.
Arama kutusuna Konuşma yazın.
Sonuçlar listesinde Konuşma'ya ve ardından Oluştur'a tıklayın.
Kaynağınızı oluşturmak için ekrandaki yönergeleri izleyin. Şunlardan emin olun:
- Konum eastus veya westus olarak ayarlanır.
- Fiyatlandırma katmanı S0 olarak ayarlanmış.
Oluştur’u seçin.
Birkaç dakika sonra kaynağınız oluşturulur. Abonelik anahtarı, kaynağınız için Genel Bakış bölümünde kullanılabilir.
Dil modeli oluşturma
Yöneticiniz, kuruluş için Kiracı Modeli'ni etkinleştirdikten sonra, kiracı verilerinizi temel alan bir dil Microsoft 365 oluşturabilirsiniz.
Sağ üst kısmından Ayarlar (dişli simgesi) seçeneğini ve ardından Kiracı Modeli ayarları'ı seçin.

Speech Studio, kiracı modeli oluşturmak için uygun olup olmadığınızı size sağlayan bir ileti görüntüler.
Not
Enterprise müşteriler Kuzey Amerika modeli (İngilizce) oluşturabilir. Müşteri Kasası, Customer Key veya Office 365 Kamu müşteriyebilirsiniz, bu özellik kullanılamaz. Müşteri müşterisi veya Müşteri Müşteri Kasası olup olmadığı belirlemek için bkz:
Kabul et’i seçin.
Kiracı modeliniz hazır olduğunda, ek yönergeler içeren bir onay e-posta iletisi alırsınız.
Kiracı modelinizi dağıtma
Kiracı modeli örneğiniz hazır olduğunda, aşağıdaki adımları gerçekleştirerek örneği dağıtın:
Onay e-posta iletisinde Modeli görüntüle düğmesini seçin. Veya ile oturum Speech Studio.
Sağ üst kısmından Ayarlar (dişli simgesi) seçeneğini ve ardından Kiracı Modeli ayarları'ı seçin.

Dağıt'ı seçin.
Modeliniz dağıtıldığında durum Dağıtılan olarak değişir.
Konuşma SDK'sı ile kiracı modelinizi kullanma
Artık modelinizi dağıttınız, konuşma SDK'sı ile kullanabilirsiniz. Bu bölümde, Azure Active Directory (Azure AD) kimlik doğrulamasını kullanarak Konuşma Tanıma Hizmeti'ne çağrı yapmak için örnek kod kullanacağız.
Şimdi C# ile Konuşma SDK'sını çağırmada kullanabileceğiniz koda bakalım. Bu örnekte, kiracı modelinizi kullanarak konuşma tanıma gerçekleştirin. Bu kılavuzda platformunun zaten ayarlanmış olduğu varsayılan bir kılavuzdur. Kurulum yardımı gerekirse bkz. Hızlı Başlangıç: Konuşma tanıma, C# (.NET Core).
Bu kodu projenize kopyalayın:
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, projeyi yeniden oluşturmanız ve komut satırdan çalıştırmaniz gerekir. Komutunu çalıştırmadan önce, aşağıdakini yaparak birkaç parametreyi güncelleştirin:
ve
<Username>değerlerini geçerli bir kiracı<Password>kullanıcısına göre değiştirin.yerine
<Subscription-Key>Konuşma kaynağınızı abonelik anahtarıyla değiştirin. Bu değer, konuşma bölümündeki Konuşma kaynağınıza ilişkin Genel Bakış bölümünde Azure portal.yerine
<Endpoint-Uri>aşağıdaki uç noktayı seçin. yerine Konuşma{your region}kaynağınızı oluşturduğunuz bölgeyi oluşturduğunuzdan emin olun. Bu bölgeler de desteklemektedir:westus,westus2veeastus. Bölge bilgileri, konuşma kaynağınıza ilişkin Genel Bakış bölümünde Azure portal."wss://{your region}.online.princeton.customspeech.ai/msgraphcustomspeech/conversation/v1".Şu komutu çalıştırın:
dotnet TenantLMSample.dll --Username=<Username> --Password=<Password> --SubscriptionKey=<Subscription-Key> --EndpointUri=<Endpoint-Uri>
Bu öğreticide özel bir konuşma tanıma modeli Microsoft 365, dağıtmayı ve Konuşma SDK'sı ile birlikte kullanmayı öğrendiniz.