Konuşmacı Tanıma ile çalışmaya başlama
Bu hızlı başlangıçta, Konuşma SDK'sını kullanarak Konuşmacı Tanıma için temel tasarım desenlerini öğrenirsiniz, örneğin:
- Metne bağımlı ve metinden bağımsız doğrulama
- Ses grubu arasında bir ses örneğini tanımlamak için konuşmacı belirleme
- Ses profillerini silme
Konuşmacı Tanıma kavramlarına üst düzey bir bakış için genel bakış makalesine bakın. Desteklenen platformların listesi için sol gezintideki Başvuru düğümüne bakın.
Önkoşullar
Bu makalede, bir Azure hesabınız ve Konuşma hizmeti aboneliğiniz olduğu varsaylanmıştır. Hesabınız ve aboneliğiniz yoksa Konuşma hizmetini ücretsiz olarak deneyin.
Önemli
Microsoft, Konuşmacı Tanıma erişimini sınırlar. Bunu kullanmak için Azure Bilişsel Hizmetler Konuşmacı Tanıma Sınırlı Erişim Gözden Geçirmesi. Onay sonrasında Konuşmacı Tanıma API'lerine erişin.
Konuşma SDK'sı yükleme
Herhangi bir şey yapamadan önce Konuşma SDK'sı yüklemeniz gerekir. Platforma bağlı olarak aşağıdaki yönergeleri kullanın:
Bağımlılıkları içeri aktarma
Bu makaledeki örnekleri çalıştırmak için using betiğinizin en üstüne aşağıdaki deyimleri dahil etmek gerekir.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
Konuşma yapılandırması oluşturma
Konuşma SDK'sını kullanarak Konuşma hizmetine çağrı yapmak için bir oluşturmanız SpeechConfig gerekir. Bu örnekte, abonelik anahtarı SpeechConfig ve bölge kullanarak bir oluşturabilirsiniz. Ayrıca, bu makalenin geri kalanında farklı özelleştirmeler için değiştirerek kullanmak üzere bazı temel ortak kodlar da oluşturabilirsiniz.
public class Program
{
static async Task Main(string[] args)
{
// replace with your own subscription key
string subscriptionKey = "YourSubscriptionKey";
// replace with your own subscription region
string region = "YourSubscriptionRegion";
var config = SpeechConfig.FromSubscription(subscriptionKey, region);
}
}
Metne bağımlı doğrulama
Konuşmacı Doğrulama, konuşmacının bilinen veya kayıtlı bir sesle eş olduğunu doğrulama eylemidir. İlk adım, hizmetin gelecekteki ses örneklerini karşılaştıracak bir şeye sahip olmak için bir ses profili kaydetmektir. Bu örnekte, hem kayıt hem de doğrulama için belirli bir geçiş tümceciğinin kullanımını gerektiren metne bağımlı bir strateji kullanarak profili kaydedebilirsiniz. Desteklenen tümceciklerin listesi için başvuru belgelerine bakın.
Ses profilini kaydetmek için sınıfınıza Program aşağıdaki işlevi oluşturarak başlayabilirsiniz.
public static async Task VerificationEnroll(SpeechConfig config, Dictionary<string, string> profileMapping)
{
using (var client = new VoiceProfileClient(config))
using (var profile = await client.CreateProfileAsync(VoiceProfileType.TextDependentVerification, "en-us"))
using (var phraseResult = await client.GetActivationPhrasesAsync(VoiceProfileType.TextDependentVerification, "en-us"))
{
using (var audioInput = AudioConfig.FromDefaultMicrophoneInput())
{
Console.WriteLine($"Enrolling profile id {profile.Id}.");
// give the profile a human-readable display name
profileMapping.Add(profile.Id, "Your Name");
VoiceProfileEnrollmentResult result = null;
while (result is null || result.RemainingEnrollmentsCount > 0)
{
Console.WriteLine($"Speak the passphrase, \"${phraseResult.Phrases[0]}\"");
result = await client.EnrollProfileAsync(profile, audioInput);
Console.WriteLine($"Remaining enrollments needed: {result.RemainingEnrollmentsCount}");
Console.WriteLine("");
}
if (result.Reason == ResultReason.EnrolledVoiceProfile)
{
await SpeakerVerify(config, profile, profileMapping);
}
else if (result.Reason == ResultReason.Canceled)
{
var cancellation = VoiceProfileEnrollmentCancellationDetails.FromResult(result);
Console.WriteLine($"CANCELED {profile.Id}: ErrorCode={cancellation.ErrorCode} ErrorDetails={cancellation.ErrorDetails}");
}
}
}
}
Bu await client.CreateProfileAsync() işlevde, aslında yeni ses profilini oluşturan şeydir. Oluşturulduktan sonra, varsayılan giriş cihazınızın seslerini yakalamak için bu örnekte kullanarak ses örneklerini AudioConfig.FromDefaultMicrophoneInput() nasıl girebilirsiniz? Ardından, kalan ve kayıt için gerekli olan örneklerin sayısını while takip edersiniz. Her yinelemede, geçiş tümceciği mikrofonunuzla konuşmanızı ve örneği client.EnrollProfileAsync(profile, audioInput) ses profiline eklemenizi sağlar.
Kayıt tamamlandıktan sonra, yeni oluşturduğunuz await SpeakerVerify(config, profile, profileMapping) profille ilgili doğrulama yapmak için çağrısında bulundurabilirsiniz. tanımlamak için başka bir işlev SpeakerVerify ekleyin.
public static async Task SpeakerVerify(SpeechConfig config, VoiceProfile profile, Dictionary<string, string> profileMapping)
{
var speakerRecognizer = new SpeakerRecognizer(config, AudioConfig.FromDefaultMicrophoneInput());
var model = SpeakerVerificationModel.FromProfile(profile);
Console.WriteLine("Speak the passphrase to verify: \"My voice is my passport, please verify me.\"");
var result = await speakerRecognizer.RecognizeOnceAsync(model);
Console.WriteLine($"Verified voice profile for speaker {profileMapping[result.ProfileId]}, score is {result.Score}");
}
Bu işlevde, doğrulamak için VoiceProfile bir modeli başlatmak için yeni oluşturduğunuz nesneyi iletirsiniz. Ardından, geçiş tümceciği yeniden konuşmanızı istiyor, ancak bu kez bunu ses profilinize göre doğrular ve await speakerRecognizer.RecognizeOnceAsync(model) 0.0-1.0 arasında bir benzerlik puanı geri döner. Nesnesi, result geçiş Accept Reject tümceciğinin eş olup olmadığını temel alarak veya döndürür.
Ardından, oluşturduğunuz Main() yeni işlevleri çağıracak şekilde işlevinizi değiştirebilirsiniz. Ayrıca, işlev çağrılarınızı kullanarak Dictionary<string, string> başvuruyla geçiş yapmak için bir oluştur ola unutmayın. Bunun nedeni, hizmetin oluşturulan bir ile okunabilir bir ad depolamaya izin vermesi ve yalnızca gizlilik amacıyla bir kimlik numarası VoiceProfile depolamasıdır. VerificationEnrollişlevinde, bu sözlükte yeni oluşturulan kimliği ve metin adını içeren bir giriş eklersiniz. İnsan tarafından okunabilir bir ad görüntülemesi gereken uygulama geliştirme senaryolarında, bu eşlemeyi bir yerde depolamalı, hizmet tarafından depolanmaz.
static async Task Main(string[] args)
{
string subscriptionKey = "YourSubscriptionKey";
string region = "westus";
var config = SpeechConfig.FromSubscription(subscriptionKey, region);
// persist profileMapping if you want to store a record of who the profile is
var profileMapping = new Dictionary<string, string>();
await VerificationEnroll(config, profileMapping);
Console.ReadLine();
}
Betiği çalıştırın; sizden My voice is my passport (Sesim benim passportum) tümceciğiyle konuşmanız, kayıt için üç kez doğrulamanız ve bir kez daha doğrulama için bir kez daha ifadeniz istenir. Döndürülen sonuç, doğrulama için kendi özel eşiklerinizi oluşturmak üzere kullanabileceğiniz benzerlik puanıdır.
Enrolling profile id 87-2cef-4dff-995b-dcefb64e203f.
Speak the passphrase, "My voice is my passport, verify me."
Remaining enrollments needed: 2
Speak the passphrase, "My voice is my passport, verify me."
Remaining enrollments needed: 1
Speak the passphrase, "My voice is my passport, verify me."
Remaining enrollments needed: 0
Speak the passphrase to verify: "My voice is my passport, verify me."
Verified voice profile for speaker Your Name, score is 0.915581
Metinden bağımsız doğrulama
Metne bağımlı doğrulamanın aksine, metinden bağımsız doğrulama:
- Üç ses örneği gerektirmez, ancak toplam ses için 20 saniye gerektirir
Metinden bağımsız doğrulamaya VerificationEnroll geçmek için işlevinize birkaç basit değişiklik yapın. İlk olarak doğrulama türünü olarak VoiceProfileType.TextIndependentVerification değiştirirsiniz. Ardından, 20 saniyelik ses yakalanana kadar sizden konuşmanızı istem edecek şekilde while result.RemainingEnrollmentsSpeechLength döngüyü izlemek için değiştirebilirsiniz.
public static async Task VerificationEnroll(SpeechConfig config, Dictionary<string, string> profileMapping)
{
using (var client = new VoiceProfileClient(config))
using (var profile = await client.CreateProfileAsync(VoiceProfileType.TextIndependentVerification, "en-us"))
using (var phraseResult = await client.GetActivationPhrasesAsync(VoiceProfileType.TextIndependentVerification, "en-us"))
{
using (var audioInput = AudioConfig.FromDefaultMicrophoneInput())
{
Console.WriteLine($"Enrolling profile id {profile.Id}.");
// give the profile a human-readable display name
profileMapping.Add(profile.Id, "Your Name");
VoiceProfileEnrollmentResult result = null;
while (result is null || result.RemainingEnrollmentsSpeechLength > TimeSpan.Zero)
{
Console.WriteLine($"Speak the activation phrase, \"${phraseResult.Phrases[0]}\"");
result = await client.EnrollProfileAsync(profile, audioInput);
Console.WriteLine($"Remaining enrollment audio time needed: {result.RemainingEnrollmentsSpeechLength}");
Console.WriteLine("");
}
if (result.Reason == ResultReason.EnrolledVoiceProfile)
{
await SpeakerVerify(config, profile, profileMapping);
}
else if (result.Reason == ResultReason.Canceled)
{
var cancellation = VoiceProfileEnrollmentCancellationDetails.FromResult(result);
Console.WriteLine($"CANCELED {profile.Id}: ErrorCode={cancellation.ErrorCode} ErrorDetails={cancellation.ErrorDetails}");
}
}
}
}
Programı yeniden çalıştırın. Benzerlik puanı da döndürülür.
Enrolling profile id 4tt87d4-f2d3-44ae-b5b4-f1a8d4036ee9.
Speak the activation phrase, "<FIRST ACTIVATION PHRASE>"
Remaining enrollment audio time needed: 00:00:15.3200000
Speak the activation phrase, "<FIRST ACTIVATION PHRASE>"
Remaining enrollment audio time needed: 00:00:09.8100008
Speak the activation phrase, "<FIRST ACTIVATION PHRASE>"
Remaining enrollment audio time needed: 00:00:05.1900000
Speak the activation phrase, "<FIRST ACTIVATION PHRASE>"
Remaining enrollment audio time needed: 00:00:00.8700000
Speak the activation phrase, "<FIRST ACTIVATION PHRASE>"
Remaining enrollment audio time needed: 00:00:00
Speak the passphrase to verify: "My voice is my passport, please verify me."
Verified voice profile for speaker Your Name, score is 0.849409
Konuşmacı belirleme
Konuşmacı Belirleme, belirli bir kayıtlı ses grubundan kimin konuşmacı olduğunu belirlemek için kullanılır. İşlem, metinden bağımsız doğrulamaya çok benzer. Temel fark, tek bir profille doğrulamak yerine aynı anda birden çok ses profiline karşı doğrulama yapmaktır.
Birden çok ses IdentificationEnroll profilini kaydetmek için bir işlev oluşturun. Her profil için kayıt işlemi, metinden bağımsız doğrulama için kayıt işlemiyle aynıdır ve her profil için 20 saniye ses gerektirir. Bu işlev dize listesini kabul eder profileNames ve listede yer alan her ad için yeni bir ses profili oluşturacak. işlevi, bir sonraki VoiceProfile işlevde konuşmacıyı tanımlamak için kullanabileceğiniz nesnelerin listesini döndürür.
public static async Task<List<VoiceProfile>> IdentificationEnroll(SpeechConfig config, List<string> profileNames, Dictionary<string, string> profileMapping)
{
List<VoiceProfile> voiceProfiles = new List<VoiceProfile>();
using (var client = new VoiceProfileClient(config))
using (var phraseResult = await client.GetActivationPhrasesAsync(VoiceProfileType.TextIndependentVerification, "en-us"))
{
foreach (string name in profileNames)
{
using (var audioInput = AudioConfig.FromDefaultMicrophoneInput())
{
var profile = await client.CreateProfileAsync(VoiceProfileType.TextIndependentIdentification, "en-us");
Console.WriteLine($"Creating voice profile for {name}.");
profileMapping.Add(profile.Id, name);
VoiceProfileEnrollmentResult result = null;
while (result is null || result.RemainingEnrollmentsSpeechLength > TimeSpan.Zero)
{
Console.WriteLine($"Speak the activation phrase, \"${phraseResult.Phrases[0]}\" to add to the profile enrollment sample for {name}.");
result = await client.EnrollProfileAsync(profile, audioInput);
Console.WriteLine($"Remaining enrollment audio time needed: {result.RemainingEnrollmentsSpeechLength}");
Console.WriteLine("");
}
voiceProfiles.Add(profile);
}
}
}
return voiceProfiles;
}
Kimlik isteği göndermek SpeakerIdentification için aşağıdaki işlevi oluşturun. Bu işlevdeki temel fark, konuşmacı doğrulama isteğine kıyasla nesne listesini kabul eden SpeakerIdentificationModel.FromProfiles() işlevinin VoiceProfile kullanımıdır.
public static async Task SpeakerIdentification(SpeechConfig config, List<VoiceProfile> voiceProfiles, Dictionary<string, string> profileMapping)
{
var speakerRecognizer = new SpeakerRecognizer(config, AudioConfig.FromDefaultMicrophoneInput());
var model = SpeakerIdentificationModel.FromProfiles(voiceProfiles);
Console.WriteLine("Speak some text to identify who it is from your list of enrolled speakers.");
var result = await speakerRecognizer.RecognizeOnceAsync(model);
Console.WriteLine($"The most similar voice profile is {profileMapping[result.ProfileId]} with similarity score {result.Score}");
}
İşlevini Main() aşağıdaki gibi değiştirme. işleviniz için geçişini profileNames yapılan dizelerin listesini IdentificationEnroll() oluşturabilirsiniz. Bu, bu listede yer alan her ad için yeni bir ses profili oluşturmanızı ister, böylece arkadaşlarınız veya iş arkadaşlarınız için ek profiller oluşturmak için daha fazla ad ekleyebilirsiniz.
static async Task Main(string[] args)
{
// replace with your own subscription key
string subscriptionKey = "YourSubscriptionKey";
// replace with your own subscription region
string region = "YourSubscriptionRegion";
var config = SpeechConfig.FromSubscription(subscriptionKey, region);
// persist profileMapping if you want to store a record of who the profile is
var profileMapping = new Dictionary<string, string>();
var profileNames = new List<string>() { "Your name", "A friend's name" };
var enrolledProfiles = await IdentificationEnroll(config, profileNames, profileMapping);
await SpeakerIdentification(config, enrolledProfiles, profileMapping);
foreach (var profile in enrolledProfiles)
{
profile.Dispose();
}
Console.ReadLine();
}
Betiği çalıştırın; ilk profil için ses örneklerini kaydetmek için konuşmanız istenir. Kayıt tamamlandıktan sonra, bu işlemi listesinde yer alan her ad için tekrarlamanız profileNames istenir. Her kayıt tamam olduktan sonra herkesin konuşmalarını istenir ve hizmet bu kişiyi kayıtlı ses profillerinden belirlemeye çalışacaktır.
Bu örnek yalnızca en yakın eşleşmeyi ve benzerlik puanını döndürür, ancak işlevinize ekleyerek ilk beş benzerlik puanını içeren tam yanıtı string json = result.Properties.GetProperty(PropertyId.SpeechServiceResponse_JsonResult) SpeakerIdentification elde etmiş oluruz.
Ses giriş türünü değiştirme
Bu makaledeki örneklerde ses örnekleri için giriş olarak varsayılan cihaz mikrofonu kullanılır. Ancak, mikrofon girişi yerine ses dosyalarını kullanmak istediğiniz senaryolarda, dosya girişine geçmek için herhangi AudioConfig.FromDefaultMicrophoneInput() AudioConfig.FromWavFileInput(path/to/your/file.wav) bir örneğini olarak değiştirebilirsiniz. Örneğin kayıt için bir mikrofon ve doğrulama için dosyalar kullanarak karma girişler de kullanabilirsiniz.
Ses profili kayıtlarını silme
Kayıtlı bir profili silmek için DeleteProfileAsync() nesnede işlevini VoiceProfileClient kullanın. Aşağıdaki örnek işlev, bilinen bir ses profili kimliğinden ses profilinin nasıl silindiği gösterir.
public static async Task DeleteProfile(SpeechConfig config, string profileId)
{
using (var client = new VoiceProfileClient(config))
{
var profile = new VoiceProfile(profileId);
await client.DeleteProfileAsync(profile);
}
}
Bu hızlı başlangıçta, Konuşma SDK'sını kullanarak Konuşmacı Tanıma için temel tasarım desenlerini öğrenirsiniz, örneğin:
- Metne bağımlı ve metinden bağımsız doğrulama
- Ses grubu arasında bir ses örneğini tanımlamak için konuşmacı belirleme
- Ses profillerini silme
Konuşmacı Tanıma kavramlarına üst düzey bir bakış için genel bakış makalesine bakın. Desteklenen platformların listesi için sol gezintideki Başvuru düğümüne bakın.
GitHub'da örneklere atla
Doğrudan örnek koda atlamak için aşağıdaki C++ hızlı başlangıç örneklerine GitHub.
Önkoşullar
Bu makalede, bir Azure hesabınız ve Konuşma hizmeti aboneliğiniz olduğu varsaylanmıştır. Hesabınız ve aboneliğiniz yoksa Konuşma hizmetini ücretsiz olarak deneyin.
Önemli
Microsoft, Konuşmacı Tanıma erişimini sınırlar. Bunu kullanmak için Azure Bilişsel Hizmetler Konuşmacı Tanıma Sınırlı Erişim Gözden Geçirmesi. Onay sonrasında Konuşmacı Tanıma API'lerine erişin.
Konuşma SDK'sı yükleme
Herhangi bir şey yapamadan önce Konuşma SDK'sı yüklemeniz gerekir. Platforma bağlı olarak aşağıdaki yönergeleri kullanın:
Bağımlılıkları içeri aktarma
Bu makaledeki örnekleri çalıştırmak için .cpp dosyanın en üstüne aşağıdaki deyimlerini ekleyin.
#include <iostream>
#include <stdexcept>
// Note: Install the NuGet package Microsoft.CognitiveServices.Speech.
#include <speechapi_cxx.h>
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;
// Note: Change the locale if desired.
auto profile_locale = "en-us";
auto audio_config = Audio::AudioConfig::FromDefaultMicrophoneInput();
auto ticks_per_second = 10000000;
Konuşma yapılandırması oluşturma
Konuşma SDK'sını kullanarak Konuşma hizmetine çağrı yapmak için bir oluşturmanız SpeechConfig gerekir. Bu sınıf, anahtarınız ve ilişkili bölge, uç nokta, konak veya yetkilendirme belirteci gibi aboneliğiniz hakkında bilgiler içerir.
shared_ptr<SpeechConfig> GetSpeechConfig()
{
auto subscription_key = 'PASTE_YOUR_SPEECH_SUBSCRIPTION_KEY_HERE';
auto region = 'PASTE_YOUR_SPEECH_ENDPOINT_REGION_HERE';
auto config = SpeechConfig::FromSubscription(subscription_key, region);
return config;
}
Metne bağımlı doğrulama
Konuşmacı Doğrulama, konuşmacının bilinen veya kayıtlı bir sesle eş olduğunu doğrulama eylemidir. İlk adım, hizmetin gelecekteki ses örneklerini karşılaştıracak bir şeye sahip olmak için bir ses profili kaydetmektir. Bu örnekte, hem kayıt hem de doğrulama için belirli bir parola gerektiren metne bağımlı bir strateji kullanarak profili kaydedebilirsiniz. Desteklenen parolaların listesi için başvuru belgelerine bakın.
TextDependentVerification işlevi
İşlevi oluşturarak TextDependentVerification başlayalım.
void TextDependentVerification(shared_ptr<VoiceProfileClient> client, shared_ptr<SpeakerRecognizer> recognizer)
{
std::cout << "Text Dependent Verification:\n\n";
// Create the profile.
auto profile = client->CreateProfileAsync(VoiceProfileType::TextDependentVerification, profile_locale).get();
std::cout << "Created profile ID: " << profile->GetId() << "\n";
AddEnrollmentsToTextDependentProfile(client, profile);
SpeakerVerify(profile, recognizer);
// Delete the profile.
client->DeleteProfileAsync(profile);
}
Bu işlev CreateProfileAsync yöntemiyle bir VoiceProfile nesnesi oluşturur. Üç tür olduğunu VoiceProfile unutmayın:
- TextIndependentIdentification
- TextDependentVerification
- TextIndependentVerification
Bu durumda, 'ye VoiceProfileType::TextDependentVerification CreateProfileAsync geçersiniz.
Ardından, ve tanımladığınız iki yardımcı işlevi AddEnrollmentsToTextDependentProfile SpeakerVerify çağırabilirsiniz. Son olarak, profili temizlemek için DeleteProfileAsync çağrısında bulundurabilirsiniz.
AddEnrollmentsToTextDependentProfile işlevi
Ses profilini kaydetmek için aşağıdaki işlevi tanımlayın.
void AddEnrollmentsToTextDependentProfile(shared_ptr<VoiceProfileClient> client, shared_ptr<VoiceProfile> profile)
{
shared_ptr<VoiceProfileEnrollmentResult> enroll_result = nullptr;
while (enroll_result == nullptr || enroll_result->GetEnrollmentInfo(EnrollmentInfoType::RemainingEnrollmentsCount) > 0)
{
std::cout << "Please say the passphrase, \"My voice is my passport, verify me.\"\n";
enroll_result = client->EnrollProfileAsync(profile, audio_config).get();
std::cout << "Remaining enrollments needed: " << enroll_result->GetEnrollmentInfo(EnrollmentInfoType::RemainingEnrollmentsCount) << ".\n";
}
std::cout << "Enrollment completed.\n\n";
}
Bu işlevde, kalan ve kayıt için gerekli olan örneklerin sayısını while takip edersiniz. Her yinelemede EnrollProfileAsync, parolayı mikrofonunuzla konuşmanızı ve örneği ses profiline ekler.
SpeakerVerify işlevi
Aşağıdaki SpeakerVerify gibi tanımlayın.
void SpeakerVerify(shared_ptr<VoiceProfile> profile, shared_ptr<SpeakerRecognizer> recognizer)
{
shared_ptr<SpeakerVerificationModel> model = SpeakerVerificationModel::FromProfile(profile);
std::cout << "Speak the passphrase to verify: \"My voice is my passport, verify me.\"\n";
shared_ptr<SpeakerRecognitionResult> result = recognizer->RecognizeOnceAsync(model).get();
std::cout << "Verified voice profile for speaker: " << result->ProfileId << ". Score is: " << result->GetScore() << ".\n\n";
}
Bu işlevde, daha önce oluşturduğunuz VoiceProfile nesnesini geçerek SpeakerVerificationModel::FromProfile yöntemiyle bir SpeakerVerificationModel nesnesi oluştururuz.
Ardından SpeechRecognizer::RecognizeOnceAsync parolayı yeniden konuşmanızı istiyor, ancak bu kez bunu ses profilinize göre doğrular ve 0.0-1.0 arasında bir benzerlik puanı geri döner. SpeakerRecognitionResult nesnesi, parolanın eş olup olmadığını temel alarak Accept Reject veya döndürür.
Metinden bağımsız doğrulama
Metne bağımlı doğrulamanın aksine, metinden bağımsız doğrulama üç ses örneği gerektirmez, ancak toplam ses için 20 saniye gerektirir.
TextIndependentVerification işlevi
İşlevi oluşturarak TextIndependentVerification başlayalım.
void TextIndependentVerification(shared_ptr<VoiceProfileClient> client, shared_ptr<SpeakerRecognizer> recognizer)
{
std::cout << "Text Independent Verification:\n\n";
// Create the profile.
auto profile = client->CreateProfileAsync(VoiceProfileType::TextIndependentVerification, profile_locale).get();
std::cout << "Created profile ID: " << profile->GetId() << "\n";
AddEnrollmentsToTextIndependentProfile(client, profile);
SpeakerVerify(profile, recognizer);
// Delete the profile.
client->DeleteProfileAsync(profile);
}
İşlev gibi TextDependentVerification bu işlev de CreateProfileAsync yöntemiyle bir VoiceProfile nesnesi oluşturur.
Bu durumda, 'ye VoiceProfileType::TextIndependentVerification CreateProfileAsync geçersiniz.
Ardından iki yardımcı işlevi çağırabilirsiniz: , sonraki işlevi tanımladığınız ve AddEnrollmentsToTextIndependentProfile SpeakerVerify zaten tanımladığınız. Son olarak, profili temizlemek için DeleteProfileAsync çağrısında bulundurabilirsiniz.
AddEnrollmentsToTextIndependentProfile
Ses profilini kaydetmek için aşağıdaki işlevi tanımlayın.
void AddEnrollmentsToTextIndependentProfile(shared_ptr<VoiceProfileClient> client, shared_ptr<VoiceProfile> profile)
{
shared_ptr<VoiceProfileEnrollmentResult> enroll_result = nullptr;
while (enroll_result == nullptr || enroll_result->GetEnrollmentInfo(EnrollmentInfoType::RemainingEnrollmentsSpeechLength) > 0)
{
std::cout << "Continue speaking to add to the profile enrollment sample.\n";
enroll_result = client->EnrollProfileAsync(profile, audio_config).get();
std::cout << "Remaining audio time needed: " << enroll_result->GetEnrollmentInfo(EnrollmentInfoType::RemainingEnrollmentsSpeechLength) / ticks_per_second << " seconds.\n";
}
std::cout << "Enrollment completed.\n\n";
}
Bu işlevde, kalan ve kayıt için gereken ses saniye sayısını takip edersiniz. while Her yinelemede EnrollProfileAsync, mikrofonunuzla konuşmanızı ve örneği ses profiline ekler.
Konuşmacı belirleme
Konuşmacı Belirleme, belirli bir kayıtlı ses grubundan kimin konuşmacı olduğunu belirlemek için kullanılır. İşlem, metinden bağımsız doğrulamaya çok benzer. Temel fark, tek bir profille doğrulamak yerine aynı anda birden çok ses profiline karşı doğrulama yapmaktır.
TextIndependentIdentification işlevi
İşlevi oluşturarak TextIndependentIdentification başlayalım.
void TextIndependentIdentification(shared_ptr<VoiceProfileClient> client, shared_ptr<SpeakerRecognizer> recognizer)
{
std::cout << "Speaker Identification:\n\n";
// Create the profile.
auto profile = client->CreateProfileAsync(VoiceProfileType::TextIndependentIdentification, profile_locale).get();
std::cout << "Created profile ID: " << profile->GetId() << "\n";
AddEnrollmentsToTextIndependentProfile(client, profile);
SpeakerIdentify(profile, recognizer);
// Delete the profile.
client->DeleteProfileAsync(profile);
}
ve işlevleri gibi bu işlev de TextDependentVerification TextIndependentVerification CreateProfileAsync yöntemiyle bir VoiceProfile nesnesi oluşturur.
Bu durumda, 'ye VoiceProfileType::TextIndependentIdentification CreateProfileAsync geçersiniz.
Ardından iki yardımcı işlevi çağırabilirsiniz: önceden tanımladığınız ve bundan sonra AddEnrollmentsToTextIndependentProfile SpeakerIdentify tanımladığınız . Son olarak, profili temizlemek için DeleteProfileAsync çağrısında bulundurabilirsiniz.
SpeakerIdentify işlevi
İşlevi SpeakerIdentify aşağıdaki gibi tanımlayın.
void SpeakerIdentify(shared_ptr<VoiceProfile> profile, shared_ptr<SpeakerRecognizer> recognizer)
{
shared_ptr<SpeakerIdentificationModel> model = SpeakerIdentificationModel::FromProfiles({ profile });
// Note: We need at least four seconds of audio after pauses are subtracted.
std::cout << "Please speak for at least ten seconds to identify who it is from your list of enrolled speakers.\n";
shared_ptr<SpeakerRecognitionResult> result = recognizer->RecognizeOnceAsync(model).get();
std::cout << "The most similar voice profile is: " << result->ProfileId << " with similarity score: " << result->GetScore() << ".\n\n";
}
Bu işlevde SpeakerIdentificationModel::FromProfiles yöntemiyle bir SpeakerIdentificationModel nesnesi oluştururuz. SpeakerIdentificationModel::FromProfilesVoiceProfile nesnelerinin listesini kabul eder. Bu durumda, yalnızca daha önce oluşturduğunuz VoiceProfile nesneyi iletirsiniz. Ancak, 2000'den fazla nesne (her biri farklı bir sesten ses örnekleriyle kayıtlı) geçiş VoiceProfile yapmak için kullanabilirsiniz.
Ardından SpeechRecognizer::RecognizeOnceAsync yeniden konuşmanız istenir. Bu kez sesinizi kayıtlı ses profilleriyle karşılaştırıldığında en benzer ses profilini döndürür.
Main işlevi
Son olarak, işlevini main aşağıdaki gibi tanımlayın.
int main()
{
auto speech_config = GetSpeechConfig();
auto client = VoiceProfileClient::FromConfig(speech_config);
auto recognizer = SpeakerRecognizer::FromConfig(speech_config, audio_config);
TextDependentVerification(client, recognizer);
TextIndependentVerification(client, recognizer);
TextIndependentIdentification(client, recognizer);
std::cout << "End of quickstart.\n";
}
Bu işlev yalnızca daha önce tanımlandığı işlevleri çağıran bir işlevdir. Ancak ilk olarak bir VoiceProfileClient nesnesi ve bir SpeakerRecognizer nesnesi oluşturur.
auto speech_config = GetSpeechConfig();
auto client = VoiceProfileClient::FromConfig(speech_config);
auto recognizer = SpeakerRecognizer::FromConfig(speech_config, audio_config);
, VoiceProfileClient ses profillerini oluşturmak, kaydetmek ve silmek için kullanılır. , SpeakerRecognizer bir veya daha fazla kayıtlı ses profiline göre konuşma örneklerini doğrulamak için kullanılır.
Ses giriş türünü değiştirme
Bu makaledeki örneklerde, ses örnekleri için giriş olarak varsayılan cihaz mikrofonu kullanılır. Ancak, mikrofon girişi yerine ses dosyalarını kullanmanın gerek olduğu senaryolarda aşağıdaki satırı değiştirmeniz gerekir:
auto audio_config = Audio::AudioConfig::FromDefaultMicrophoneInput();
Yeni değer:
auto audio_config = Audio::AudioConfig::FromWavFileInput(path/to/your/file.wav);
Veya herhangi bir kullanımını audio_config Audio::AudioConfig::FromWavFileInput ile değiştirin. Örneğin kayıt için bir mikrofon ve doğrulama için dosyalar kullanarak karma girişler de kullanabilirsiniz.
Bu hızlı başlangıçta, Konuşma SDK'sını kullanarak Konuşmacı Tanıma için temel tasarım desenlerini öğrenirsiniz, örneğin:
- Metne bağımlı ve metinden bağımsız doğrulama
- Ses grubu arasında bir ses örneğini tanımlamak için konuşmacı belirleme
- Ses profillerini silme
Konuşmacı Tanıma kavramlarına üst düzey bir bakış için genel bakış makalesine bakın. Desteklenen platformların listesi için sol gezintideki Başvuru düğümüne bakın.
GitHub'da örneklere atla
Doğrudan örnek koda atlamak için aşağıdaki JavaScript hızlı başlangıç örneklerine GitHub.
Önkoşullar
Bu makalede, bir Azure hesabınız ve Konuşma hizmeti aboneliğiniz olduğu varsaylanmıştır. Hesabınız ve aboneliğiniz yoksa Konuşma hizmetini ücretsiz olarak deneyin.
Önemli
Konuşmacı Tanıma şu anda yalnızca bölgede oluşturulan Azure Konuşma kaynaklarında westus de kullanılabilir.
Konuşma SDK'sı yükleme
Herhangi bir şey yapamadan önce JavaScript için Konuşma SDK'sı yüklemeniz gerekir. Platforma bağlı olarak aşağıdaki yönergeleri kullanın:
Ayrıca, hedef ortama bağlı olarak aşağıdakilerden birini kullanın:
JavaScript için Konuşma SDK'sı microsoft.cognitiveservices.speech.sdk.bundle.js ve ayıklar ve HTML dosyanız tarafından erişilebilen bir klasöre yer almaktadır.
<script src="microsoft.cognitiveservices.speech.sdk.bundle.js"></script>;
İpucu
Bir web tarayıcısını hedefiyorsanız ve etiketini <script> kullanıyorsanız, sdk ön ek gerekli değildir. Ön sdk ek, modülü adlandıran bir diğer require addır.
Bağımlılıkları içeri aktarma
Bu makaledeki örnekleri çalıştırmak için aşağıdaki deyimlerini dosya dosyanıza .js ekleyin.
"use strict";
/* To run this sample, install:
npm install microsoft-cognitiveservices-speech-sdk
*/
var sdk = require("microsoft-cognitiveservices-speech-sdk");
var fs = require("fs");
// Note: Change the locale if desired.
const profile_locale = "en-us";
/* Note: passphrase_files and verify_file should contain paths to audio files that contain \"My voice is my passport, verify me.\"
You can obtain these files from:
https://github.com/Azure-Samples/cognitive-services-speech-sdk/tree/fa6428a0837779cbeae172688e0286625e340942/quickstart/javascript/node/speaker-recognition/verification
*/
const passphrase_files = ["myVoiceIsMyPassportVerifyMe01.wav", "myVoiceIsMyPassportVerifyMe02.wav", "myVoiceIsMyPassportVerifyMe03.wav"];
const verify_file = "myVoiceIsMyPassportVerifyMe04.wav";
/* Note: identify_file should contain a path to an audio file that uses the same voice as the other files, but contains different speech. You can obtain this file from:
https://github.com/Azure-Samples/cognitive-services-speech-sdk/tree/fa6428a0837779cbeae172688e0286625e340942/quickstart/javascript/node/speaker-recognition/identification
*/
const identify_file = "aboutSpeechSdk.wav";
var subscription_key = 'PASTE_YOUR_SPEECH_SUBSCRIPTION_KEY_HERE';
var region = 'PASTE_YOUR_SPEECH_ENDPOINT_REGION_HERE';
const ticks_per_second = 10000000;
Bu deyimler gerekli kitaplıkları içeri aktararak Konuşma hizmeti abonelik anahtarınızı ve bölgenizi ortam değişkenlerinize aktarın. Ayrıca, aşağıdaki görevlerde kullanmak üzere ses dosyalarının yollarını belirtir.
Yardımcı işlevi oluşturma
Ses dosyalarını Konuşma hizmeti tarafından kullanmak üzere akışlara okumak için aşağıdaki yardımcı işlevi ekleyin.
/* From: https://github.com/Azure-Samples/cognitive-services-speech-sdk/blob/fa6428a0837779cbeae172688e0286625e340942/quickstart/javascript/node/speaker-recognition/verification/dependent-verification.js#L8
*/
function GetAudioConfigFromFile (file)
{
let pushStream = sdk.AudioInputStream.createPushStream();
fs.createReadStream(file).on("data", function(arrayBuffer) {
pushStream.write(arrayBuffer.buffer);
}).on("end", function() {
pushStream.close();
});
return sdk.AudioConfig.fromStreamInput(pushStream);
}
Bu işlevde, AudioConfig nesnesi oluşturmak için AudioInputStream.createPushStream ve AudioConfig.fromStreamInput yöntemlerini kullanırsiniz. Bu AudioConfig nesne bir ses akışını temsil eder. Aşağıdaki görevler sırasında bu AudioConfig nesnelerin birkaçı kullanılır.
Metne bağımlı doğrulama
Konuşmacı Doğrulama, konuşmacının bilinen veya kayıtlı bir sesle eş olduğunu doğrulama eylemidir. İlk adım, hizmetin gelecekteki ses örneklerini karşılaştıracak bir şeye sahip olmak için bir ses profili kaydetmektir. Bu örnekte, hem kayıt hem de doğrulama için belirli bir parola gerektiren metne bağımlı bir strateji kullanarak profili kaydedebilirsiniz. Desteklenen parolaların listesi için başvuru belgelerine bakın.
TextDependentVerification işlevi
İşlevi oluşturarak TextDependentVerification başlayabilirsiniz.
async function TextDependentVerification(client, speech_config)
{
console.log ("Text Dependent Verification:\n");
var profile = null;
try {
// Create the profile.
profile = await new Promise ((resolve, reject) => {
client.createProfileAsync (sdk.VoiceProfileType.TextDependentVerification, profile_locale, result => { resolve(result); }, error => { reject(error); });
});
console.log ("Created profile ID: " + profile.profileId);
await AddEnrollmentsToTextDependentProfile(client, profile, passphrase_files);
const audio_config = GetAudioConfigFromFile(verify_file);
const recognizer = new sdk.SpeakerRecognizer(speech_config, audio_config);
await SpeakerVerify(profile, recognizer);
}
catch (error) {
console.log ("Error:\n" + error);
}
finally {
if (profile !== null) {
console.log ("Deleting profile ID: " + profile.profileId);
await new Promise ((resolve, reject) => {
client.deleteProfileAsync (profile, result => { resolve(result); }, error => { reject(error); });
});
}
}
}
Bu işlev, VoiceProfileClient.createProfileAsync yöntemiyle bir VoiceProfile nesnesi oluşturur. Üç tür olduğunu VoiceProfile unutmayın:
- TextIndependentIdentification
- TextDependentVerification
- TextIndependentVerification
Bu durumda, 'ye VoiceProfileType.TextDependentVerification VoiceProfileClient.createProfileAsync geçersiniz.
Daha sonra ve tanımladığınız iki yardımcı işlevi AddEnrollmentsToTextDependentProfile SpeakerVerify çağırabilirsiniz. Son olarak, profili kaldırmak için VoiceProfileClient.deleteProfileAsync'i arayın.
AddEnrollmentsToTextDependentProfile işlevi
Ses profilini kaydetmek için aşağıdaki işlevi tanımlayın.
async function AddEnrollmentsToTextDependentProfile(client, profile, audio_files)
{
for (var i = 0; i < audio_files.length; i++) {
console.log ("Adding enrollment to text dependent profile...");
const audio_config = GetAudioConfigFromFile (audio_files[i]);
const result = await new Promise ((resolve, reject) => {
client.enrollProfileAsync (profile, audio_config, result => { resolve(result); }, error => { reject(error); });
});
if (result.reason === sdk.ResultReason.Canceled) {
throw(JSON.stringify(sdk.VoiceProfileEnrollmentCancellationDetails.fromResult(result)));
}
else {
console.log ("Remaining enrollments needed: " + result.privDetails["remainingEnrollmentsCount"] + ".");
}
};
console.log ("Enrollment completed.\n");
}
Bu işlevde, ses örneklerinden GetAudioConfigFromFile nesne oluşturmak için daha önce AudioConfig tanımlandığı işlevi çağırabilirsiniz. Bu ses örnekleri "Sesim passportum, beni doğrula" gibi bir şifre içerir. Ardından VoiceProfileClient.enrollProfileAsync yöntemini kullanarak bu ses örneklerini kaydedebilirsiniz.
SpeakerVerify işlevi
Aşağıdaki SpeakerVerify gibi tanımlayın.
async function SpeakerVerify(profile, recognizer)
{
const model = sdk.SpeakerVerificationModel.fromProfile(profile);
const result = await new Promise ((resolve, reject) => {
recognizer.recognizeOnceAsync (model, result => { resolve(result); }, error => { reject(error); });
});
console.log ("Verified voice profile for speaker: " + result.profileId + ". Score is: " + result.score + ".\n");
}
Bu işlevde, daha önce oluşturduğunuz VoiceProfile nesnesini geçerek SpeakerVerificationModel.FromProfile yöntemiyle bir SpeakerVerificationModel nesnesi oluştururuz.
Ardından SpeechRecognizer.recognizeOnceAsync yöntemini çağırarak daha önce kaydolan ses örnekleriyle aynı parolayı içeren bir ses örneğini doğrularsiniz. SpeechRecognizer.recognizeOnceAsync özelliği 0.0-1.0 arasında bir benzerlik puanı içeren SpeakerRecognitionResult score nesnesini döndürür. nesnesi, SpeakerRecognitionResult reason ResultReasontüründe bir özelliği de içerir. Doğrulama başarılı olursa özelliğin reason değerine sahip olması RecognizedSpeaker gerekir.
Metinden bağımsız doğrulama
Metne bağımlı doğrulamanın aksine, metinden bağımsız doğrulama:
- Belirli bir parolanın konuşulacağını gerektirmez, her şey konuşul olabilir
- Üç ses örneği gerektirmez, ancak toplam ses için 20 saniye gerektirir
TextIndependentVerification işlevi
İşlevi oluşturarak TextIndependentVerification başlayabilirsiniz.
async function TextIndependentVerification(client, speech_config)
{
console.log ("Text Independent Verification:\n");
var profile = null;
try {
// Create the profile.
profile = await new Promise ((resolve, reject) => {
client.createProfileAsync (sdk.VoiceProfileType.TextIndependentVerification, profile_locale, result => { resolve(result); }, error => { reject(error); });
});
console.log ("Created profile ID: " + profile.profileId);
await AddEnrollmentsToTextIndependentProfile(client, profile, [identify_file]);
const audio_config = GetAudioConfigFromFile(passphrase_files[0]);
const recognizer = new sdk.SpeakerRecognizer(speech_config, audio_config);
await SpeakerVerify(profile, recognizer);
}
catch (error) {
console.log ("Error:\n" + error);
}
finally {
if (profile !== null) {
console.log ("Deleting profile ID: " + profile.profileId);
await new Promise ((resolve, reject) => {
client.deleteProfileAsync (profile, result => { resolve(result); }, error => { reject(error); });
});
}
}
}
İşlevde TextDependentVerification olduğu gibi bu işlev de VoiceProfileClient.createProfileAsync yöntemiyle bir VoiceProfile nesnesi oluşturur.
Bu durumda, 'ye VoiceProfileType.TextIndependentVerification createProfileAsync geçersiniz.
Daha sonra iki yardımcı işlevi çağırabilirsiniz: , daha sonra tanımladığınız ve AddEnrollmentsToTextIndependentProfile SpeakerVerify zaten tanımladığınız. Son olarak, profili kaldırmak için VoiceProfileClient.deleteProfileAsync'i arayın.
AddEnrollmentsToTextIndependentProfile
Ses profilini kaydetmek için aşağıdaki işlevi tanımlayın.
async function AddEnrollmentsToTextIndependentProfile(client, profile, audio_files)
{
for (var i = 0; i < audio_files.length; i++) {
console.log ("Adding enrollment to text independent profile...");
const audio_config = GetAudioConfigFromFile (audio_files[i]);
const result = await new Promise ((resolve, reject) => {
client.enrollProfileAsync (profile, audio_config, result => { resolve(result); }, error => { reject(error); });
});
if (result.reason === sdk.ResultReason.Canceled) {
throw(JSON.stringify(sdk.VoiceProfileEnrollmentCancellationDetails.fromResult(result)));
}
else {
console.log ("Remaining audio time needed: " + (result.privDetails["remainingEnrollmentsSpeechLength"] / ticks_per_second) + " seconds.");
}
}
console.log ("Enrollment completed.\n");
}
Bu işlevde, ses örneklerinden GetAudioConfigFromFile nesne oluşturmak için daha önce AudioConfig tanımlandığı işlevi çağırabilirsiniz. Ardından VoiceProfileClient.enrollProfileAsync yöntemini kullanarak bu ses örneklerini kaydedebilirsiniz.
Konuşmacı belirleme
Konuşmacı Belirleme, belirli bir kayıtlı ses grubundan kimin konuşmacı olduğunu belirlemek için kullanılır. İşlem, metinden bağımsız doğrulamaya benzer. Temel fark, tek bir profille doğrulamak yerine aynı anda birden çok ses profiline karşı doğrulama yapmaktır.
TextIndependentIdentification işlevi
İşlevi oluşturarak TextIndependentIdentification başlayabilirsiniz.
async function TextIndependentIdentification(client, speech_config)
{
console.log ("Text Independent Identification:\n");
var profile = null;
try {
// Create the profile.
profile = await new Promise ((resolve, reject) => {
client.createProfileAsync (sdk.VoiceProfileType.TextIndependentIdentification, profile_locale, result => { resolve(result); }, error => { reject(error); });
});
console.log ("Created profile ID: " + profile.profileId);
await AddEnrollmentsToTextIndependentProfile(client, profile, [identify_file]);
const audio_config = GetAudioConfigFromFile(passphrase_files[0]);
const recognizer = new sdk.SpeakerRecognizer(speech_config, audio_config);
await SpeakerIdentify(profile, recognizer);
}
catch (error) {
console.log ("Error:\n" + error);
}
finally {
if (profile !== null) {
console.log ("Deleting profile ID: " + profile.profileId);
await new Promise ((resolve, reject) => {
client.deleteProfileAsync (profile, result => { resolve(result); }, error => { reject(error); });
});
}
}
}
ve işlevleri TextDependentVerification gibi bu işlev de TextIndependentVerification VoiceProfileClient.createProfileAsync yöntemiyle bir VoiceProfile nesnesi oluşturur.
Bu durumda, 'ye VoiceProfileType.TextIndependentIdentification VoiceProfileClient.createProfileAsync geçersiniz.
Ardından iki yardımcı işlevi çağırabilirsiniz: önceden tanımladığınız ve bundan sonra AddEnrollmentsToTextIndependentProfile SpeakerIdentify tanımladığınız . Son olarak, profili kaldırmak için VoiceProfileClient.deleteProfileAsync'i arayın.
SpeakerIdentify işlevi
İşlevi SpeakerIdentify aşağıdaki gibi tanımlayın.
async function SpeakerIdentify(profile, recognizer)
{
const model = sdk.SpeakerIdentificationModel.fromProfiles([profile]);
const result = await new Promise ((resolve, reject) => {
recognizer.recognizeOnceAsync (model, result => { resolve(result); }, error => { reject(error); });
});
console.log ("The most similar voice profile is: " + result.profileId + " with similarity score: " + result.score + ".\n");
}
Bu işlevde, daha önce oluşturduğunuz VoiceProfile nesnesini geçerek SpeakerIdentificationModel.fromProfiles yöntemiyle bir SpeakerIdentificationModel nesnesi oluştururuz.
Ardından SpeechRecognizer.recognizeOnceAsync yöntemini çağırarak bir ses örneği iletirsiniz.
SpeechRecognizer.recognizeOnceAsync , oluşturmak için kullanılan nesnelere göre bu ses VoiceProfile örneğinin sesini belirlemeye SpeakerIdentificationModel çalışır. Özelliği profileId VoiceProfile 0.0-1.0 arasında bir benzerlik puanı içerirken, özelliği eşleşen 'i (varsa) tanımlayan bir SpeakerRecognitionResult score nesnesi döndürür.
Main işlevi
Son olarak, işlevini main aşağıdaki gibi tanımlayın.
async function main() {
const speech_config = sdk.SpeechConfig.fromSubscription(subscription_key, region);
const client = new sdk.VoiceProfileClient(speech_config);
await TextDependentVerification(client, speech_config);
await TextIndependentVerification(client, speech_config);
await TextIndependentIdentification(client, speech_config);
console.log ("End of quickstart.");
}
main();
Bu işlev, ses profillerini oluşturmak, kaydetmek ve silmek için kullanılan bir VoiceProfileClient nesnesi oluşturur. Ardından daha önce tanımlandığı işlevleri çağırtır.
Bu hızlı başlangıçta, konuşma SDK 'sını kullanarak konuşmacı tanıma için temel tasarım düzenlerini öğrenirsiniz; örneğin:
- Metne bağımlı ve metinden bağımsız doğrulama
- Sesler grubu arasında bir ses örneği tanımlamak için konuşmacı tanımlaması
- Ses profillerini silme
Konuşmacı Tanıma kavramlarıyla ilgili üst düzey bir görünüm için bkz. genel bakış makalesi. Desteklenen platformların listesi için sol gezinti bölmesinde başvuru düğümüne bakın.
Önkoşullar
Bu makalede bir Azure hesabınız ve konuşma hizmeti aboneliğiniz olduğunu varsaymaktadır. Hesabınız ve aboneliğiniz yoksa konuşma hizmetini ücretsiz deneyin.
Önemli
Konuşmacı tanıma özelliği şu anda yalnızca bölgede oluşturulan Azure konuşma kaynaklarında desteklenmektedir westus .
Metne bağımlı doğrulama
Konuşmacı Doğrulama, konuşmacının bilinen veya kayıtlı bir sesle eşleştiğini onaylama işlemidir. İlk adım, bir ses profilini kaydetmek ve bu sayede hizmetin gelecekteki sesli örnekleri karşılaştırmak için bir şey olması gerekir. Bu örnekte, profili, hem kayıt hem de doğrulama için kullanılmak üzere belirli bir parola gerektiren metne bağlı bir strateji kullanarak kaydedeolursunuz. Desteklenen parola listesi için başvuru belgelerine bakın.
Bir ses profili oluşturarakbaşlayın. Bu makaledeki her bir kıvrımlı komuta konuşma hizmeti abonelik anahtarınızı ve bölgenizi eklemeniz gerekir.
# Note Change locale if needed.
curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker/verification/v2.0/text-dependent/profiles' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: application/json' \
--data-raw '{
'\''locale'\'':'\''en-us'\''
}'
Üç tür ses profili vardır:
- Metne bağımlı doğrulama
- Metnin bağımsız doğrulaması
- Metnin bağımsız tanımlayıcısı
Bu durumda, metne bağlı bir doğrulama Ses profili oluşturursunuz. Aşağıdaki yanıtı almalısınız.
{
"remainingEnrollmentsCount": 3,
"locale": "en-us",
"createdDateTime": "2020-09-29T14:54:29.683Z",
"enrollmentStatus": "Enrolling",
"modelVersion": null,
"profileId": "714ce523-de76-4220-b93f-7c1cc1882d6e",
"lastUpdatedDateTime": null,
"enrollmentsCount": 0,
"enrollmentsLength": 0.0,
"enrollmentSpeechLength": 0.0
}
Ardından, ses profilini kaydedin. --data-binaryParametre değeri için, bilgisayarınızda desteklenen parolaları içeren bir ses dosyası belirtin, örneğin "My Voice My Passport sunucum, beni Doğrula" gibi. bu tür bir ses dosyasını Windows Ses Kaydedicisigibi bir uygulamayla kaydedebilir veya metin okumakullanarak oluşturabilirsiniz.
curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker/verification/v2.0/text-dependent/profiles/INSERT_PROFILE_ID_HERE/enrollments' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary @'INSERT_FILE_PATH_HERE'
Aşağıdaki yanıtı almalısınız.
{
"remainingEnrollmentsCount": 2,
"passPhrase": "my voice is my passport verify me",
"profileId": "714ce523-de76-4220-b93f-7c1cc1882d6e",
"enrollmentStatus": "Enrolling",
"enrollmentsCount": 1,
"enrollmentsLength": 3.5,
"enrollmentsSpeechLength": 2.88,
"audioLength": 3.5,
"audioSpeechLength": 2.88
}
Bu yanıt, iki ses örneği kaydetmeniz gerektiğini söyler.
Toplam üç ses örneğini kaydettikten sonra, aşağıdaki yanıtı almalısınız.
{
"remainingEnrollmentsCount": 0,
"passPhrase": "my voice is my passport verify me",
"profileId": "714ce523-de76-4220-b93f-7c1cc1882d6e",
"enrollmentStatus": "Enrolled",
"enrollmentsCount": 3,
"enrollmentsLength": 10.5,
"enrollmentsSpeechLength": 8.64,
"audioLength": 3.5,
"audioSpeechLength": 2.88
}
Artık bir ses örneğini ses profiline karşı doğrulamayahazırsınız. Bu ses örneği, ses profilini kaydetmek için kullandığınız örneklerle aynı parolayı içermelidir.
curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker/verification/v2.0/text-dependent/profiles/INSERT_PROFILE_ID_HERE/verify' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary @'INSERT_FILE_PATH_HERE'
Aşağıdaki yanıtı almalısınız.
{
"recognitionResult": "Accept",
"score": 1.0
}
, Accept Parolanın eşleştiği ve doğrulamanın başarılı olduğu anlamına gelir. Yanıt, 0,0-1,0 ' y i değişen bir benzerlik puanı da içerir.
Son olarak, ses profilini silin.
curl --location --request DELETE \
'INSERT_ENDPOINT_HERE/speaker/verification/v2.0/text-dependent/profiles/INSERT_PROFILE_ID_HERE' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE'
Yanıt yok.
Metnin bağımsız doğrulaması
Metne bağımlı doğrulamanın aksine, metinden bağımsız doğrulama:
- Belirli bir parolanın söyulmasına gerek yoktur, her şey söylenebilir
- Üç ses örneği gerektirmez, ancak 20 saniye Toplam ses gerektirir
Bir metin bağımsız doğrulama profili oluşturarakbaşlayın.
curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker/verification/v2.0/text-independent/profiles' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: application/json' \
--data-raw '{
'\''locale'\'':'\''en-us'\''
}'
Aşağıdaki yanıtı almalısınız.
{
"remainingEnrollmentsSpeechLength": 20.0,
"locale": "en-us",
"createdDateTime": "2020-09-29T16:08:52.409Z",
"enrollmentStatus": "Enrolling",
"modelVersion": null,
"profileId": "3f85dca9-ffc9-4011-bf21-37fad2beb4d2",
"lastUpdatedDateTime": null,
"enrollmentsCount": 0,
"enrollmentsLength": 0.0,
"enrollmentSpeechLength": 0.0
}
Ardından, ses profilini kaydedin. Bu, üç ses örneği göndermek yerine, toplam 20 saniyelik ses içeren ses örnekleri göndermeniz gerekir.
curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker/verification/v2.0/text-independent/profiles/INSERT_PROFILE_ID_HERE/enrollments' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary @'INSERT_FILE_PATH_HERE'
Yeterli ses örneği gönderdikten sonra, aşağıdaki yanıtı almalısınız.
{
"remainingEnrollmentsSpeechLength": 0.0,
"profileId": "3f85dca9-ffc9-4011-bf21-37fad2beb4d2",
"enrollmentStatus": "Enrolled",
"enrollmentsCount": 1,
"enrollmentsLength": 33.16,
"enrollmentsSpeechLength": 29.21,
"audioLength": 33.16,
"audioSpeechLength": 29.21
}
Artık bir ses örneğini ses profiline karşı doğrulamayahazırsınız. Bu ses örneğinin bir parola içermesi gerekmez. En az dört saniyelik ses içerdiği sürece herhangi bir konuşma içerebilir.
curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker/verification/v2.0/text-independent/profiles/INSERT_PROFILE_ID_HERE/verify' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary @'INSERT_FILE_PATH_HERE'
Aşağıdaki yanıtı almalısınız.
{
"recognitionResult": "Accept",
"score": 0.9196669459342957
}
, Accept Doğrulamanın başarılı olduğu anlamına gelir. Yanıt, 0,0-1,0 ' y i değişen bir benzerlik puanı da içerir.
Son olarak, ses profilini silin.
curl --location --request DELETE 'INSERT_ENDPOINT_HERE/speaker/verification/v2.0/text-independent/profiles/INSERT_PROFILE_ID_HERE' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE'
Yanıt yok.
Konuşmacı belirleme
Konuşmacı kimliği, belirli bir kayıtlı ses grubundan kimin konuşduğunu tespit etmek için kullanılır. Bu işlem, tek bir profille doğrulanması yerine, aynı anda birden çok ses profiline karşı bir kez kimlik doğrulaması yapabilmekle birlikte, metnin bağımsız doğrulamasına benzer.
Metin bağımsız bir kimlik profili oluşturarakbaşlayın.
# Note Change locale if needed.
curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker/identification/v2.0/text-independent/profiles' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: application/json' \
--data-raw '{
'\''locale'\'':'\''en-us'\''
}'
Aşağıdaki yanıtı almalısınız.
{
"remainingEnrollmentsSpeechLength": 20.0,
"locale": "en-us",
"createdDateTime": "2020-09-22T17:25:48.642Z",
"enrollmentStatus": "Enrolling",
"modelVersion": null,
"profileId": "de99ab38-36c8-4b82-b137-510907c61fe8",
"lastUpdatedDateTime": null,
"enrollmentsCount": 0,
"enrollmentsLength": 0.0,
"enrollmentSpeechLength": 0.0
}
Ardından, ses profilini kaydedin. Yine, toplam 20 saniyelik ses içeren ses örnekleri göndermeniz gerekir. Bu örneklerin bir parola içermesi gerekmez.
curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker/identification/v2.0/text-independent/profiles/INSERT_PROFILE_ID_HERE/enrollments' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary @'INSERT_FILE_PATH_HERE'
Yeterli ses örneği gönderdikten sonra, aşağıdaki yanıtı almalısınız.
{
"remainingEnrollmentsSpeechLength": 0.0,
"profileId": "de99ab38-36c8-4b82-b137-510907c61fe8",
"enrollmentStatus": "Enrolled",
"enrollmentsCount": 2,
"enrollmentsLength": 36.69,
"enrollmentsSpeechLength": 31.95,
"audioLength": 33.16,
"audioSpeechLength": 29.21
}
Artık ses profilini kullanarak bir ses örneğini belirlemekiçin hazırsınız. Tanımla komutu, olası ses profili kimliklerinin virgülle ayrılmış bir listesini kabul eder. Bu durumda, yalnızca daha önce oluşturduğunuz ses profilinin KIMLIĞINI geçireceğiz. Bununla birlikte, isterseniz, her bir ses profilinin farklı bir sesten ses örneklerine kaydolduğu birden fazla ses profili kimliği geçirebilirsiniz.
curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker/identification/v2.0/text-independent/profiles/identifySingleSpeaker?profileIds=INSERT_PROFILE_ID_HERE' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary @'INSERT_FILE_PATH_HERE'
Aşağıdaki yanıtı almalısınız.
Success:
{
"identifiedProfile": {
"profileId": "de99ab38-36c8-4b82-b137-510907c61fe8",
"score": 0.9083486
},
"profilesRanking": [
{
"profileId": "de99ab38-36c8-4b82-b137-510907c61fe8",
"score": 0.9083486
}
]
}
Yanıt, gönderdiğiniz ses örneği ile en yakından eşleşen ses profilinin KIMLIĞINI içerir. Ayrıca, benzerlik sırasına göre derecelendirilen aday ses profillerinin bir listesini içerir.
Son olarak, ses profilini silin.
curl --location --request DELETE \
'INSERT_ENDPOINT_HERE/speaker/identification/v2.0/text-independent/profiles/INSERT_PROFILE_ID_HERE' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE'
Yanıt yok.
Sonraki adımlar
Sınıflar ve işlevler hakkında ayrıntılı bilgi için Konuşmacı Tanıma başvuru belgelerine bakın.