Hızlı Başlangıç: Kimin konuştuğunu tanıma ve doğrulama

Başvuru belgeleri | Paket (NuGet) | GitHub'da Ek Örnekler

Bu hızlı başlangıçta Konuşma SDK'sını kullanarak konuşmacı tanımaya yönelik temel tasarım desenlerini öğreneceksiniz:

  • Metne bağımlı ve metinden bağımsız doğrulama.
  • Bir ses grubu arasında bir ses örneğini tanımlamak için konuşmacı belirleme.
  • Ses profilleri siliniyor.

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 bölmedeki Başvuru düğümüne bakın.

Önemli

Microsoft, konuşmacı tanımaya erişimi sınırlar. Azure AI Konuşmacı Tanıma Sınırlı Erişim gözden geçirmesi formu aracılığıyla kullanmak için uygulayın. Onaydan sonra Konuşmacı Tanıma API'lerine erişebilirsiniz.

Önkoşullar

Konuşma SDK'sını yükleme

Başlamadan önce Konuşma SDK'sını yüklemeniz gerekir. Platformunuza 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 betiğinizin en üstüne aşağıdaki using deyimleri ekleyin:

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 hizmetini çağırmak için bir SpeechConfig örnek oluşturmanız gerekir. Bu örnekte, bir SpeechConfig abonelik anahtarı ve bölge kullanarak bir örnek oluşturacaksınız. Ayrıca, farklı özelleştirmeler için değiştirdiğiniz bu makalenin geri kalanında kullanmak üzere bazı temel ortak kodlar da oluşturursunuz.

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

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şleşdiğini onaylama işlemidir. İlk adım, hizmette gelecekteki ses örneklerini karşılaştıracak bir şey olması için bir ses profili kaydetmektir. Bu örnekte, kayıt ve doğrulama için belirli bir parola gerektiren metne bağımlı bir strateji kullanarak profili kaydedersiniz. Desteklenen parolaların listesi için başvuru belgelerine bakın.

Bir ses profili kaydetmek için sınıfınızda Program aşağıdaki işlevi oluşturarak başlayın:

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"))
    {
        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 işlevde, await client.CreateProfileAsync() yeni ses profilini oluşturan aslında budur. Oluşturulduktan sonra, varsayılan giriş cihazınızdan ses yakalamak için bu örnekte kullanarak AudioConfig.FromDefaultMicrophoneInput() ses örneklerini nasıl giriş yapacağınızı belirtirsiniz. Ardından, ses örneklerini kayıt için kalan örneklerin sayısını izleyen ve gerekli olan bir while döngüye kaydedersiniz. Her yinelemede, client.EnrollProfileAsync(profile, audioInput) parolayı mikrofonunuza konuşmanızı ister ve örneği ses profiline ekler.

Kayıt tamamlandıktan sonra, az önce oluşturduğunuz profili doğrulamak için arayın await SpeakerVerify(config, profile, profileMapping) . tanımlamak SpeakerVerifyiçin başka bir işlev 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 üzere bir model başlatmak için yeni oluşturduğunuz nesneyi geçirirsiniz VoiceProfile . Ardından parolayı await speakerRecognizer.RecognizeOnceAsync(model) yeniden konuşmanızı ister. Bu kez ses profilinizde doğrulanır ve 0,0 ile 1,0 arasında bir benzerlik puanı döndürür. Nesnesi result ayrıca parolanın eşleşip eşleşmediğine bağlı olarak veya RejectdöndürürAccept.

Ardından, oluşturduğunuz yeni işlevleri çağırmak için işlevinizi Main() değiştirin. Ayrıca işlev çağrılarınız aracılığıyla başvuruya göre geçirmek için bir Dictionary<string, string> oluşturduğunuzu da unutmayın. Bunun nedeni, hizmetin oluşturulan VoiceProfilebir ile insan tarafından okunabilir bir adın depolanmasına izin vermemesi ve yalnızca gizlilik amacıyla bir kimlik numarası depolamasıdır. İşlevde VerificationEnroll , bu sözlüğe yeni oluşturulan kimliği içeren bir girdi ve bir metin adı eklersiniz. İnsan tarafından okunabilir bir ad görüntülemeniz gereken uygulama geliştirme senaryolarında bu eşlemeyi bir yerde depolamanız gerekir çünkü hizmet bunu depolayamaz.

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. Kayıt için üç kez ve doğrulama için bir kez daha "Sesim pasaportum, beni doğrula" ifadesini kullanmanız istenir. Döndürülen sonuç, doğrulama için kendi özel eşiklerinizi oluşturmak için 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 20 saniyelik ses gerektirir.

Metinden bağımsız doğrulamaya geçmek için işlevinizde VerificationEnroll birkaç basit değişiklik yapın. İlk olarak, doğrulama türünü olarak VoiceProfileType.TextIndependentVerificationdeğiştirirsiniz. Ardından, 20 saniyelik ses yakalanana kadar sizden konuşmanızı istemeye devam edecek olan döngüsünü izleme result.RemainingEnrollmentsSpeechLengtholarak değiştirinwhile.

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"))
    {
        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 ve benzerlik puanı 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ştuğunu belirlemek için kullanılır. İşlem, metinden bağımsız doğrulamaya benzer. Temel fark, tek bir profilde doğrulamak yerine aynı anda birden çok ses profiline karşı doğrulama özelliğidir.

Birden çok ses profilini kaydetmek için bir işlev IdentificationEnroll 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. bu işlem her profil için 20 saniyelik ses gerektirir. Bu işlev bir dize listesini kabul eder profileNames ve listedeki her ad için yeni bir ses profili oluşturur. işlevi, bir sonraki işlevde konuşmacıyı tanımlamak için kullanacağınız nesnelerin listesini VoiceProfile 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))
    {
        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 için aşağıdaki işlevi SpeakerIdentification oluşturun. Bu işlevin konuşmacı doğrulama isteğiyle karşılaştırıldığında temel farkı, nesne listesini kabul eden kullanımıdırSpeakerIdentificationModel.FromProfiles()VoiceProfile.

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

İşlevinizi Main() aşağıdaki şekilde değiştirin. İşlevinize geçirdiğiniz dizelerin profileNameslistesini oluşturursunuz IdentificationEnroll() . Arkadaşlarınız veya iş arkadaşlarınız için daha fazla profil oluşturmak üzere daha fazla ad ekleyebilmeniz için bu listedeki her ad için yeni bir ses profili oluşturmanız istenir.

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. İlk profil için ses örneklerini kaydetmek için konuşmanız istenir. Kayıt tamamlandıktan sonra, listedeki her ad profileNames için bu işlemi yinelemeniz istenir. Her kayıt tamamlandıktan sonra , herkesin konuşmasını istemeniz istenir. Hizmet daha sonra kayıtlı ses profilleriniz arasından bu kişiyi tanımlamaya çalışır.

Bu örnek yalnızca en yakın eşleşmeyi ve benzerlik puanını döndürür. İlk beş benzerlik puanını içeren tam yanıtı almak için işlevinize SpeakerIdentification ekleyinstring json = result.Properties.GetProperty(PropertyId.SpeechServiceResponse_JsonResult).

Ses giriş türünü değiştirme

Bu makaledeki örneklerde ses örnekleri için giriş olarak varsayılan cihaz mikrofonu kullanılır. Mikrofon girişi yerine ses dosyalarını kullanmanız gereken senaryolarda, dosya girişine geçmek için öğesinin AudioConfig.FromDefaultMicrophoneInput() herhangi bir örneğini olarak AudioConfig.FromWavFileInput(path/to/your/file.wav) değiştirin. Örneğin, kayıt için mikrofon ve doğrulama dosyaları kullanarak da karma girişlere sahip olabilirsiniz.

Ses profili kayıtlarını silme

Kayıtlı bir profili silmek için nesnedeki VoiceProfileClient işlevini kullanınDeleteProfileAsync(). Aşağıdaki örnek işlev, bilinen bir ses profili kimliğinden ses profilini silme işlemini 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);
    }
}

Başvuru belgeleri | Paket (NuGet) | GitHub'da Ek Örnekler

Bu hızlı başlangıçta Konuşma SDK'sını kullanarak konuşmacı tanımaya yönelik temel tasarım desenlerini öğreneceksiniz:

  • Metne bağımlı ve metinden bağımsız doğrulama.
  • Bir ses grubu arasında 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 bölmedeki Başvuru düğümüne bakın.

Önemli

Microsoft, konuşmacı tanımaya erişimi sınırlar. Azure AI Konuşmacı Tanıma Sınırlı Erişim Gözden Geçirme formu aracılığıyla kullanmak için uygulayın. Onaydan sonra Konuşmacı Tanıma API'lerine erişebilirsiniz.

Önkoşullar

Konuşma SDK'sını yükleme

Başlamadan önce Konuşma SDK'sını yüklemeniz gerekir. Platformunuza 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ızın en üstüne aşağıdaki deyimleri 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 hizmetini çağırmak için bir SpeechConfig sınıf oluşturun. Bu sınıf, anahtarınız ve ilişkili bölgeniz, uç noktanız, konağınız veya yetkilendirme belirteciniz gibi aboneliğinizle ilgili bilgileri içerir.

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

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şleşdiğini onaylama işlemidir. İlk adım, hizmette gelecekteki ses örneklerini karşılaştıracak bir şey olması için bir ses profili kaydetmektir. Bu örnekte, kayıt ve doğrulama için belirli bir parola gerektiren metne bağımlı bir strateji kullanarak profili kaydedersiniz. Desteklenen parolaların listesi için başvuru belgelerine bakın.

TextDependentVerification işlevi

İşlevi TextDependentVerification oluşturarak başlayın:

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 vardırVoiceProfile:

  • TextIndependentIdentification
  • TextDependentVerification
  • TextIndependentVerification

Bu durumda adresine geçirirsiniz VoiceProfileType::TextDependentVerificationCreateProfileAsync.

Ardından, daha sonra AddEnrollmentsToTextDependentProfile tanımlayabileceğiniz iki yardımcı işlevi çağırırsınız ve SpeakerVerify. Son olarak, profili temizlemek için DeleteProfileAsync'i çağırın.

AddEnrollmentsToTextDependentProfile işlevi

Ses profili 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;
    auto phraseResult = client->GetActivationPhrasesAsync(profile->GetType(), profile_locale).get();
    auto phrases = phraseResult->GetPhrases();
    while (enroll_result == nullptr || enroll_result->GetEnrollmentInfo(EnrollmentInfoType::RemainingEnrollmentsCount) > 0)
    {
        if (phrases != nullptr && phrases->size() > 0)
        {
            std::cout << "Please say the passphrase, \"" << phrases->at(0) << "\"\n";
            enroll_result = client->EnrollProfileAsync(profile, audio_config).get();
            std::cout << "Remaining enrollments needed: " << enroll_result->GetEnrollmentInfo(EnrollmentInfoType::RemainingEnrollmentsCount) << ".\n";
        }
        else
        {
            std::cout << "No passphrases received, enrollment not attempted.\n\n";
        }
    }
    std::cout << "Enrollment completed.\n\n";
}

Bu işlevde ses örneklerini kayıt için kalan ve gerekli örneklerin sayısını izleyen bir while döngüye kaydedersiniz. Her yinelemede , EnrollProfileAsync sizden mikrofonunuza parolayı konuşmanızı ister ve örneği ses profiline ekler.

SpeakerVerify işlevi

Aşağıdaki gibi tanımlayın SpeakerVerify :

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çirerek SpeakerVerificationModel::FromProfile yöntemiyle bir SpeakerVerificationModel nesnesi oluşturursunuz.

Ardından SpeechRecognizer::RecognizeOnceAsync sizden parolayı yeniden konuşmanızı ister. Bu kez ses profilinizde doğrular ve 0,0 ile 1,0 arasında bir benzerlik puanı döndürür. SpeakerRecognitionResult nesnesi de parolanın eşleşip eşleşmediğine göre veya Reject döndürürAccept.

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 20 saniyelik ses gerektirir.

TextIndependentVerification işlevi

İşlevi TextIndependentVerification oluşturarak başlayın:

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

İşlevde olduğu TextDependentVerification gibi bu işlev de CreateProfileAsync yöntemiyle bir VoiceProfile nesnesi oluşturur.

Bu durumda adresine geçirirsiniz VoiceProfileType::TextIndependentVerificationCreateProfileAsync.

Ardından iki yardımcı işlevi çağırırsınız: AddEnrollmentsToTextIndependentProfilebundan sonra tanımlayabileceğiniz ve SpeakerVerifyönceden tanımladığınız . Son olarak, profili temizlemek için DeleteProfileAsync'i çağırın.

AddEnrollmentsToTextIndependentProfile

Ses profili 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;
    auto phraseResult = client->GetActivationPhrasesAsync(profile->GetType(), profile_locale).get();
    auto phrases = phraseResult->GetPhrases();
    while (enroll_result == nullptr || enroll_result->GetEnrollmentInfo(EnrollmentInfoType::RemainingEnrollmentsSpeechLength) > 0)
    {
        if (phrases != nullptr && phrases->size() > 0)
        {
            std::cout << "Please say the activation phrase, \"" << phrases->at(0) << "\"\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";
        }
        else
        {
            std::cout << "No activation phrases received, enrollment not attempted.\n\n";
        }
    }
    std::cout << "Enrollment completed.\n\n";
}

Bu işlevde ses örneklerini kayıt için kalan ve gerekli olan saniye sayısını izleyen bir while döngüye kaydedersiniz. Her yinelemede , EnrollProfileAsync mikrofonunuza konuşmanızı ister ve örneği ses profiline ekler.

Konuşmacı belirleme

Konuşmacı belirleme, belirli bir kayıtlı ses grubundan kimin konuştuğunu belirlemek için kullanılır. İşlem, metinden bağımsız doğrulamaya benzer. Temel fark, tek bir profilde doğrulamak yerine aynı anda birden çok ses profiline karşı doğrulama özelliğidir.

TextIndependentIdentification işlevi

İşlevi TextIndependentIdentification oluşturarak başlayın:

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

TextDependentVerification ve TextIndependentVerification işlevleri gibi bu işlev de CreateProfileAsync yöntemiyle bir VoiceProfile nesnesi oluşturur.

Bu durumda adresine geçirirsiniz VoiceProfileType::TextIndependentIdentificationCreateProfileAsync.

Ardından iki yardımcı işlevi çağırırsınız: AddEnrollmentsToTextIndependentProfileönceden tanımladığınız ve SpeakerIdentifyardından tanımlayabileceğiniz . Son olarak, profili temizlemek için DeleteProfileAsync'i çağırın.

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şturursunuz. SpeakerIdentificationModel::FromProfilesVoiceProfile nesnelerinin listesini kabul eder. Bu durumda, daha önce oluşturduğunuz nesneyi geçirirsiniz VoiceProfile . İsterseniz, her biri farklı bir sesten ses örnekleriyle kaydedilmiş birden çok VoiceProfile nesne geçirebilirsiniz.

Ardından SpeechRecognizer::RecognizeOnceAsync yeniden konuşmanızı ister. Bu kez sesinizi kayıtlı ses profilleriyle karşılaştırır ve en benzer ses profilini döndürür.

Main işlevi

Son olarak işlevi şu şekilde tanımlayın main :

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, daha önce tanımladığınız işlevleri çağırır. İlk 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 nesne, ses profillerini oluşturmak, kaydetmek ve silmek için kullanılır. SpeakerRecognizer nesnesi, konuşma örneklerini bir veya daha fazla kayıtlı ses profilinde 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. Mikrofon girişi yerine ses dosyalarını kullanmanız gereken senaryolarda aşağıdaki satırı değiştirin:

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_configAudio::AudioConfig::FromWavFileInput ile değiştirin. Örneğin, kayıt için bir mikrofon ve doğrulama için dosyalar kullanarak da karma girişlere sahip olabilirsiniz.

Başvuru belgeleri | Paket (Go) | GitHub'da Ek Örnekler

Bu hızlı başlangıçta Konuşma SDK'sını kullanarak konuşmacı tanımaya yönelik temel tasarım desenlerini öğreneceksiniz, örneğin:

  • Metne bağımlı ve metinden bağımsız doğrulama.
  • Bir ses grubu arasında bir ses örneğini tanımlamak için konuşmacı belirleme.
  • Ses profilleri siliniyor.

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 bölmedeki Başvuru düğümüne bakın.

Önemli

Microsoft, konuşmacı tanımaya erişimi sınırlar. Azure AI Konuşmacı Tanıma Sınırlı Erişim gözden geçirmesi formu aracılığıyla kullanmak için uygulayın. Onaydan sonra Konuşmacı Tanıma API'lerine erişebilirsiniz.

Önkoşullar

Ortamı ayarlama

Go için Konuşma SDK'sını yükleyin. Daha fazla gereksinim için SDK yükleme kılavuzuna bakın

Bağımsız tanımlama gerçekleştirme

Yeni bir GO modülü oluşturmak için bu adımları izleyin.

  1. Yeni modülü istediğiniz bir komut istemi açın ve adlı independent-identification.goyeni bir dosya oluşturun.

  2. öğesinin içeriğini independent-identification.go aşağıdaki kodla değiştirin.

    package main
    
    import (
        "bufio"
        "fmt"
        "os"
        "time"
    
        "github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
        "github.com/Microsoft/cognitive-services-speech-sdk-go/common"
        "github.com/Microsoft/cognitive-services-speech-sdk-go/speaker"
        "github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
    )
    
    func GetNewVoiceProfileFromClient(client *speaker.VoiceProfileClient, expectedType common.VoiceProfileType) *speaker.VoiceProfile {
        future := client.CreateProfileAsync(expectedType, "en-US")
        outcome := <-future
        if outcome.Failed() {
            fmt.Println("Got an error creating profile: ", outcome.Error.Error())
            return nil
        }
        profile := outcome.Profile
        _, err := profile.Id()
        if err != nil {
            fmt.Println("Unexpected error creating profile id: ", err)
            return nil
        }
        profileType, err := profile.Type();
        if err != nil {
            fmt.Println("Unexpected error getting profile type: ", err)
            return nil
        }
        if profileType != expectedType {
            fmt.Println("Profile type does not match expected type")
            return nil
        }
        return profile
    }
    
    func EnrollProfile(client *speaker.VoiceProfileClient, profile *speaker.VoiceProfile, audioConfig *audio.AudioConfig) {
        enrollmentReason, currentReason := common.EnrollingVoiceProfile, common.EnrollingVoiceProfile
        var currentResult *speaker.VoiceProfileEnrollmentResult
        expectedEnrollmentCount := 1
        for currentReason == enrollmentReason {
            fmt.Println(`Please speak the following phrase: "I'll talk for a few seconds so you can recognize my voice in the future."`)
            enrollFuture := client.EnrollProfileAsync(profile, audioConfig)
            enrollOutcome := <-enrollFuture
            if enrollOutcome.Failed() {
                fmt.Println("Got an error enrolling profile: ", enrollOutcome.Error.Error())
                return
            }
            currentResult = enrollOutcome.Result
            currentReason = currentResult.Reason
            if currentResult.EnrollmentsCount != expectedEnrollmentCount {
                fmt.Println("Unexpected enrollments for profile: ", currentResult.RemainingEnrollmentsCount)
            }
            expectedEnrollmentCount += 1
        }
        if currentReason != common.EnrolledVoiceProfile {
            fmt.Println("Unexpected result enrolling profile: ", currentResult)
        }
    }
    
    func DeleteProfile(client *speaker.VoiceProfileClient, profile *speaker.VoiceProfile) {
        deleteFuture := client.DeleteProfileAsync(profile)
        deleteOutcome := <-deleteFuture
        if deleteOutcome.Failed() {
            fmt.Println("Got an error deleting profile: ", deleteOutcome.Error.Error())
            return
        }
        result := deleteOutcome.Result
        if result.Reason != common.DeletedVoiceProfile {
            fmt.Println("Unexpected result deleting profile: ", result)
        }
    }
    
    func main() {
        subscription :=  "YourSubscriptionKey"
        region := "YourServiceRegion"
        config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
        if err != nil {
            fmt.Println("Got an error: ", err)
            return
        }
        defer config.Close()
        client, err := speaker.NewVoiceProfileClientFromConfig(config)
        if err != nil {
            fmt.Println("Got an error: ", err)
            return
        }
        defer client.Close()
        audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
        if err != nil {
            fmt.Println("Got an error: ", err)
            return
        }
        defer audioConfig.Close()
        <-time.After(10 * time.Second)
        expectedType := common.VoiceProfileType(1)
    
        profile := GetNewVoiceProfileFromClient(client, expectedType)
        if profile == nil {
            fmt.Println("Error creating profile")
            return
        }
        defer profile.Close()
    
        EnrollProfile(client, profile, audioConfig)
    
        profiles := []*speaker.VoiceProfile{profile}
        model, err := speaker.NewSpeakerIdentificationModelFromProfiles(profiles)
        if err != nil {
            fmt.Println("Error creating Identification model: ", err)
        }
        if model == nil {
            fmt.Println("Error creating Identification model: nil model")
            return
        }
        identifyAudioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
        if err != nil {
            fmt.Println("Got an error: ", err)
            return
        }
        defer identifyAudioConfig.Close()
        speakerRecognizer, err := speaker.NewSpeakerRecognizerFromConfig(config, identifyAudioConfig)
        if err != nil {
            fmt.Println("Got an error: ", err)
            return
        }
        identifyFuture := speakerRecognizer.IdentifyOnceAsync(model)
        identifyOutcome := <-identifyFuture
        if identifyOutcome.Failed() {
            fmt.Println("Got an error identifying profile: ", identifyOutcome.Error.Error())
            return
        }
        identifyResult := identifyOutcome.Result
        if identifyResult.Reason != common.RecognizedSpeakers {
            fmt.Println("Got an unexpected result identifying profile: ", identifyResult)
        }
        expectedID, _ := profile.Id()
        if identifyResult.ProfileID != expectedID {
            fmt.Println("Got an unexpected profile id identifying profile: ", identifyResult.ProfileID)
        }
        if identifyResult.Score < 1.0 {
            fmt.Println("Got an unexpected score identifying profile: ", identifyResult.Score)
        }
    
        DeleteProfile(client, profile)
        bufio.NewReader(os.Stdin).ReadBytes('\n')
    }
    
  3. içinde independent-identification.godeğerini YourSubscriptionKey Konuşma kaynak anahtarınızla, değerini de Konuşma kaynak bölgenizle değiştirin YourServiceRegion .

    Önemli

    İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

GitHub'da barındırılan bileşenlere bağlanan bir go.mod dosya oluşturmak için aşağıdaki komutları çalıştırın:

go mod init independent-identification
go get github.com/Microsoft/cognitive-services-speech-sdk-go

Şimdi kodu derleyin ve çalıştırın:

go build
go run independent-identification

Bağımsız doğrulama gerçekleştirme

Yeni bir GO modülü oluşturmak için bu adımları izleyin.

  1. Yeni modülü istediğiniz bir komut istemi açın ve adlı independent-verification.goyeni bir dosya oluşturun.

  2. öğesinin içeriğini independent-verification.go aşağıdaki kodla değiştirin.

    package main
    
    import (
        "bufio"
        "fmt"
        "os"
        "time"
    
        "github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
        "github.com/Microsoft/cognitive-services-speech-sdk-go/common"
        "github.com/Microsoft/cognitive-services-speech-sdk-go/speaker"
        "github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
    )
    
    func GetNewVoiceProfileFromClient(client *speaker.VoiceProfileClient, expectedType common.VoiceProfileType) *speaker.VoiceProfile {
        future := client.CreateProfileAsync(expectedType, "en-US")
        outcome := <-future
        if outcome.Failed() {
            fmt.Println("Got an error creating profile: ", outcome.Error.Error())
            return nil
        }
        profile := outcome.Profile
        _, err := profile.Id()
        if err != nil {
            fmt.Println("Unexpected error creating profile id: ", err)
            return nil
        }
        profileType, err := profile.Type();
        if err != nil {
            fmt.Println("Unexpected error getting profile type: ", err)
            return nil
        }
        if profileType != expectedType {
            fmt.Println("Profile type does not match expected type")
            return nil
        }
        return profile
    }
    
    func EnrollProfile(client *speaker.VoiceProfileClient, profile *speaker.VoiceProfile, audioConfig *audio.AudioConfig) {
        enrollmentReason, currentReason := common.EnrollingVoiceProfile, common.EnrollingVoiceProfile
        var currentResult *speaker.VoiceProfileEnrollmentResult
        expectedEnrollmentCount := 1
        for currentReason == enrollmentReason {
            fmt.Println(`Please speak the following phrase: "I'll talk for a few seconds so you can recognize my voice in the future."`)
            enrollFuture := client.EnrollProfileAsync(profile, audioConfig)
            enrollOutcome := <-enrollFuture
            if enrollOutcome.Failed() {
                fmt.Println("Got an error enrolling profile: ", enrollOutcome.Error.Error())
                return
            }
            currentResult = enrollOutcome.Result
            currentReason = currentResult.Reason
            if currentResult.EnrollmentsCount != expectedEnrollmentCount {
                fmt.Println("Unexpected enrollments for profile: ", currentResult.RemainingEnrollmentsCount)
            }
            expectedEnrollmentCount += 1
        }
        if currentReason != common.EnrolledVoiceProfile {
            fmt.Println("Unexpected result enrolling profile: ", currentResult)
        }
    }
    
    func DeleteProfile(client *speaker.VoiceProfileClient, profile *speaker.VoiceProfile) {
        deleteFuture := client.DeleteProfileAsync(profile)
        deleteOutcome := <-deleteFuture
        if deleteOutcome.Failed() {
            fmt.Println("Got an error deleting profile: ", deleteOutcome.Error.Error())
            return
        }
        result := deleteOutcome.Result
        if result.Reason != common.DeletedVoiceProfile {
            fmt.Println("Unexpected result deleting profile: ", result)
        }
    }
    
    func main() {
        subscription :=  "YourSubscriptionKey"
        region := "YourServiceRegion"
        config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
        if err != nil {
            fmt.Println("Got an error: ", err)
            return
        }
        defer config.Close()
        client, err := speaker.NewVoiceProfileClientFromConfig(config)
        if err != nil {
            fmt.Println("Got an error: ", err)
            return
        }
        defer client.Close()
        audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
        if err != nil {
            fmt.Println("Got an error: ", err)
            return
        }
        defer audioConfig.Close()
        <-time.After(10 * time.Second)
        expectedType := common.VoiceProfileType(3)
    
        profile := GetNewVoiceProfileFromClient(client, expectedType)
        if profile == nil {
            fmt.Println("Error creating profile")
            return
        }
        defer profile.Close()
    
        EnrollProfile(client, profile, audioConfig)
    
        model, err := speaker.NewSpeakerVerificationModelFromProfile(profile)
        if err != nil {
            fmt.Println("Error creating Verification model: ", err)
        }
        if model == nil {
            fmt.Println("Error creating Verification model: nil model")
            return
        }
        verifyAudioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
        if err != nil {
            fmt.Println("Got an error: ", err)
            return
        }
        defer verifyAudioConfig.Close()
        speakerRecognizer, err := speaker.NewSpeakerRecognizerFromConfig(config, verifyAudioConfig)
        if err != nil {
            fmt.Println("Got an error: ", err)
            return
        }
        verifyFuture := speakerRecognizer.VerifyOnceAsync(model)
        verifyOutcome := <-verifyFuture
        if verifyOutcome.Failed() {
            fmt.Println("Got an error verifying profile: ", verifyOutcome.Error.Error())
            return
        }
        verifyResult := verifyOutcome.Result
        if verifyResult.Reason != common.RecognizedSpeaker {
            fmt.Println("Got an unexpected result verifying profile: ", verifyResult)
        }
        expectedID, _ := profile.Id()
        if verifyResult.ProfileID != expectedID {
            fmt.Println("Got an unexpected profile id verifying profile: ", verifyResult.ProfileID)
        }
        if verifyResult.Score < 1.0 {
            fmt.Println("Got an unexpected score verifying profile: ", verifyResult.Score)
        }
    
        DeleteProfile(client, profile)
        bufio.NewReader(os.Stdin).ReadBytes('\n')
    }
    
  3. içinde independent-verification.godeğerini YourSubscriptionKey Konuşma kaynak anahtarınızla, değerini de Konuşma kaynak bölgenizle değiştirin YourServiceRegion .

GitHub'da barındırılan bileşenlere bağlanan bir go.mod dosya oluşturmak için aşağıdaki komutları çalıştırın:

go mod init independent-verification
go get github.com/Microsoft/cognitive-services-speech-sdk-go

Şimdi kodu derleyin ve çalıştırın:

go build
go run independent-verification

Kaynakları temizleme

Oluşturduğunuz Konuşma kaynağını kaldırmak için Azure portal veya Azure Komut Satırı Arabirimi'ni (CLI) kullanabilirsiniz.

Başvuru belgeleri | GitHub'da Ek Örnekler

Java için Konuşma SDK'sı konuşmacı tanımayı destekler, ancak henüz buraya bir kılavuz eklemedik. Başlamak ve kavramlar hakkında bilgi edinmek için lütfen başka bir programlama dili seçin veya bu makalenin başından bağlantılı Java başvurusuna ve örneklerine bakın.

Başvuru belgeleri | Paket (npm) | GitHub'da | Ek ÖrneklerKitaplık kaynak kodu

Bu hızlı başlangıçta Konuşma SDK'sını kullanarak konuşmacı tanımaya yönelik temel tasarım desenlerini öğreneceksiniz:

  • Metne bağımlı ve metinden bağımsız doğrulama.
  • Bir ses grubu arasında bir ses örneğini tanımlamak için konuşmacı belirleme.
  • Ses profilleri siliniyor.

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 bölmedeki Başvuru düğümüne bakın.

Önemli

Microsoft, konuşmacı tanımaya erişimi sınırlar. Azure AI Konuşmacı Tanıma Sınırlı Erişim gözden geçirmesi formu aracılığıyla kullanmak için uygulayın. Onaydan sonra Konuşmacı Tanıma API'lerine erişebilirsiniz.

Önkoşullar

Konuşma SDK'sını yükleme

Başlamadan önce JavaScript için Konuşma SDK'sını yüklemeniz gerekir.

Hedef ortama bağlı olarak aşağıdakilerden birini kullanın:

JavaScriptmicrosoft.cognitiveservices.speech.sdk.bundle.jsdosyası için Konuşma SDK'sını indirin ve ayıklayın. HTML dosyanızın erişebileceği bir klasöre yerleştirin.

<script src="microsoft.cognitiveservices.speech.sdk.bundle.js"></script>;

İpucu

Bir web tarayıcısını hedefleyip etiketini kullanıyorsanız <script> ön sdk ek gerekli değildir. Ön sdk ek, modülü adlandırmak için kullanılan bir diğer addır require .

Bağımlılıkları içeri aktarma

Bu makaledeki örnekleri çalıştırmak için .js dosyanızın en üstüne aşağıdaki deyimleri 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 aktarır ve ortam değişkenlerinizden Konuşma hizmeti abonelik anahtarınızı ve bölgenizi alır. Ayrıca, aşağıdaki görevlerde kullanacağınız ses dosyalarının yollarını da belirtir.

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

Yardımcı işlev oluşturma

Konuşma hizmeti tarafından kullanılmak üzere akışlara ses dosyalarını okumak için aşağıdaki yardımcı işlevi ekleyin:

function GetAudioConfigFromFile (file)
{
    return sdk.AudioConfig.fromWavFileInput(fs.readFileSync(file));
}

Bu işlevde, AudioConfig nesnesi oluşturmak için AudioInputStream.createPushStream ve AudioConfig.fromStreamInput yöntemlerini kullanırsınız. Bu AudioConfig nesne bir ses akışını temsil eder. Aşağıdaki görevler sırasında bu AudioConfig nesnelerden birkaçını kullanacaksınız.

Metne bağımlı doğrulama

Konuşmacı doğrulama, konuşmacının bilinen veya kayıtlı bir sesle eşleşdiğini onaylama işlemidir. İlk adım, hizmette gelecekteki ses örneklerini karşılaştıracak bir şey olması için bir ses profili kaydetmektir. Bu örnekte, kayıt ve doğrulama için belirli bir parola gerektiren metne bağımlı bir strateji kullanarak profili kaydedersiniz. Desteklenen parolaların listesi için başvuru belgelerine bakın.

TextDependentVerification işlevi

İşlevi TextDependentVerification oluşturarak başlayın.

async function TextDependentVerification(client, speech_config)
{
    console.log ("Text Dependent Verification:\n");
    var profile = null;
    try {
        const type = sdk.VoiceProfileType.TextDependentVerification;
        // Create the profile.
        profile = await client.createProfileAsync(type, profile_locale);
        console.log ("Created profile ID: " + profile.profileId);
        // Get the activation phrases
        await GetActivationPhrases(type, profile_locale);
        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);
            const deleteResult = await client.deleteProfileAsync (profile);
        }
    }
}

Bu işlev, VoiceProfileClient.createProfileAsync yöntemiyle bir VoiceProfile nesnesi oluşturur. Üç tür vardırVoiceProfile:

  • TextIndependentIdentification
  • TextDependentVerification
  • TextIndependentVerification

Bu durumda adresine geçirirsiniz VoiceProfileType.TextDependentVerificationVoiceProfileClient.createProfileAsync.

Ardından, daha sonra AddEnrollmentsToTextDependentProfile tanımlayabileceğiniz iki yardımcı işlevi çağırırsınız ve SpeakerVerify. Son olarak, profili kaldırmak için VoiceProfileClient.deleteProfileAsync öğesini çağırın.

AddEnrollmentsToTextDependentProfile işlevi

Ses profilini kaydetmek için aşağıdaki işlevi tanımlayın:

async function AddEnrollmentsToTextDependentProfile(client, profile, audio_files)
{
    try {
        for (const file of audio_files) {
            console.log ("Adding enrollment to text dependent profile...");
            const audio_config = GetAudioConfigFromFile(file);
            const result = await client.enrollProfileAsync(profile, audio_config);
            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");
    } catch (error) {
        console.log ("Error adding enrollments: " + error);
    }
}

Bu işlevde, ses örneklerinden nesne oluşturmak AudioConfig için daha önce tanımladığınız işlevi çağırırsınızGetAudioConfigFromFile. Bu ses örnekleri "Sesim pasaportum, beni doğrula" gibi bir parola içerir. Ardından VoiceProfileClient.enrollProfileAsync yöntemini kullanarak bu ses örneklerini kaydedersiniz.

SpeakerVerify işlevi

Aşağıdaki gibi tanımlayın SpeakerVerify :

async function SpeakerVerify(profile, recognizer)
{
    try {
        const model = sdk.SpeakerVerificationModel.fromProfile(profile);
        const result = await recognizer.recognizeOnceAsync(model);
        console.log ("Verified voice profile for speaker: " + result.profileId + ". Score is: " + result.score + ".\n");
    } catch (error) {
        console.log ("Error verifying speaker: " + error);
    }
}

Bu işlevde, daha önce oluşturduğunuz VoiceProfile nesnesini geçirerek SpeakerVerificationModel.FromProfile yöntemiyle bir SpeakerVerificationModel nesnesi oluşturursunuz.

Ardından, daha önce kaydettiğiniz ses örnekleriyle aynı parolayı içeren bir ses örneğini doğrulamak için SpeechRecognizer.recognizeOnceAsync yöntemini çağırırsınız. SpeechRecognizer.recognizeOnceAsync özelliği 0,0 ile 1,0 arasında bir benzerlik puanı içeren bir SpeakerRecognitionResult nesnesi score döndürür. Nesnesi SpeakerRecognitionResult ayrıca ResultReason türünde bir reason özellik içerir. Doğrulama başarılı olursa özelliği değerine reasonRecognizedSpeakersahip olmalıdır.

Metinden bağımsız doğrulama

Metne bağımlı doğrulamanın aksine, metinden bağımsız doğrulama:

  • Belirli bir parolanın konuşulması gerekmez. Her şey konuşulabilir.
  • Üç ses örneği gerektirmez, ancak toplam 20 saniye ses gerektirir.

TextIndependentVerification işlevi

İşlevi TextIndependentVerification oluşturarak başlayın.

async function TextIndependentVerification(client, speech_config)
{
    console.log ("Text Independent Verification:\n");
    var profile = null;
    try {
        const type = sdk.VoiceProfileType.TextIndependentVerification;
        // Create the profile.
        profile = await client.createProfileAsync(type, profile_locale);
        console.log ("Created profile ID: " + profile.profileId);
        // Get the activation phrases
        await GetActivationPhrases(type, profile_locale);
        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);
            const deleteResult = await client.deleteProfileAsync (profile);
        }
    }
}

İşlevde olduğu TextDependentVerification gibi bu işlev de VoiceProfileClient.createProfileAsync yöntemiyle bir VoiceProfile nesnesi oluşturur.

Bu durumda adresine geçirirsiniz VoiceProfileType.TextIndependentVerificationcreateProfileAsync.

Ardından iki yardımcı işlevi çağırırsınız: AddEnrollmentsToTextIndependentProfilebundan sonra tanımlayabileceğiniz ve SpeakerVerifyönceden tanımladığınız . Son olarak, profili kaldırmak için VoiceProfileClient.deleteProfileAsync öğesini çağırın.

AddEnrollmentsToTextIndependentProfile

Ses profili kaydetmek için aşağıdaki işlevi tanımlayın:

async function AddEnrollmentsToTextIndependentProfile(client, profile, audio_files)
{
    try {
        for (const file of audio_files) {
            console.log ("Adding enrollment to text independent profile...");
            const audio_config = GetAudioConfigFromFile(file);
            const result = await client.enrollProfileAsync (profile, audio_config);
            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");
    } catch (error) {
        console.log ("Error adding enrollments: " + error);
    }
}

Bu işlevde, ses örneklerinden nesne oluşturmak AudioConfig için daha önce tanımladığınız işlevi çağırırsınızGetAudioConfigFromFile. Ardından VoiceProfileClient.enrollProfileAsync yöntemini kullanarak bu ses örneklerini kaydedersiniz.

Konuşmacı belirleme

Konuşmacı belirleme, belirli bir kayıtlı ses grubundan kimin konuştuğunu belirlemek için kullanılır. İşlem, metinden bağımsız doğrulamaya benzer. Temel fark, tek bir profilde doğrulamak yerine aynı anda birden çok ses profiline karşı doğrulama özelliğidir.

TextIndependentIdentification işlevi

İşlevi TextIndependentIdentification oluşturarak başlayın.

async function TextIndependentIdentification(client, speech_config)
{
    console.log ("Text Independent Identification:\n");
    var profile = null;
    try {
        const type = sdk.VoiceProfileType.TextIndependentIdentification;
        // Create the profile.
        profile = await client.createProfileAsync(type, profile_locale);
        console.log ("Created profile ID: " + profile.profileId);
        // Get the activation phrases
        await GetActivationPhrases(type, profile_locale);
        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);
            const deleteResult = await client.deleteProfileAsync (profile);
        }
    }
}

TextDependentVerification ve TextIndependentVerification işlevleri gibi bu işlev de VoiceProfileClient.createProfileAsync yöntemiyle bir VoiceProfile nesnesi oluşturur.

Bu durumda adresine geçirirsiniz VoiceProfileType.TextIndependentIdentificationVoiceProfileClient.createProfileAsync.

Ardından iki yardımcı işlevi çağırırsınız: AddEnrollmentsToTextIndependentProfileönceden tanımladığınız ve SpeakerIdentifyardından tanımlayabileceğiniz . Son olarak, profili kaldırmak için VoiceProfileClient.deleteProfileAsync öğesini çağırın.

SpeakerIdentify işlevi

İşlevi SpeakerIdentify aşağıdaki gibi tanımlayın:

async function SpeakerIdentify(profile, recognizer)
{
    try {
        const model = sdk.SpeakerIdentificationModel.fromProfiles([profile]);
        const result = await recognizer.recognizeOnceAsync(model);
        console.log ("The most similar voice profile is: " + result.profileId + " with similarity score: " + result.score + ".\n");
    } catch (error) {
        console.log ("Error identifying speaker: " + error);
    }
}

Bu işlevde, daha önce oluşturduğunuz VoiceProfile nesnesini geçirerek SpeakerIdentificationModel.fromProfiles yöntemiyle bir SpeakerIdentificationModel nesnesi oluşturursunuz.

Ardından SpeechRecognizer.recognizeOnceAsync yöntemini çağırır ve bir ses örneği geçirirsiniz. SpeechRecognizer.recognizeOnceAsync, bu ses örneğinin sesini oluşturmak SpeakerIdentificationModeliçin kullandığınız nesnelere göre VoiceProfile tanımlamaya çalışır. Özelliği 0,0 profileId ile 1,0 arasında bir benzerlik puanı içerirkenscore, özelliği varsa eşleşen VoiceProfileöğesini tanımlayan bir SpeakerRecognitionResult nesnesi döndürür.

Main işlevi

Son olarak işlevi şu şekilde tanımlayın main :

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ımladığınız işlevleri çağırır.

Başvuru belgeleri | Paket (İndir) | GitHub'da Ek Örnekler

Objective-C için Konuşma SDK'sı konuşmacı tanımayı desteklemez. Lütfen bu makalenin başından itibaren başka bir programlama dili veya Objective-C başvurusu ve bağlantılı örnekler seçin.

Başvuru belgeleri | Paket (İndir) | GitHub'da Ek Örnekler

Swift için Konuşma SDK'sı konuşmacı tanımayı desteklemez. Lütfen bu makalenin başından itibaren bağlı başka bir programlama dili veya Swift başvurusu ve örnekleri seçin.

Başvuru belgeleri | Paket (PyPi) | GitHub'da Ek Örnekler

Python için Konuşma SDK'sı konuşmacı tanımayı desteklemez. Lütfen bu makalenin başından itibaren bağlı başka bir programlama dili veya Python başvurusu ve örnekleri seçin.

Konuşmayı metne dönüştürme REST API başvurusu | Kısa ses başvurusu | için konuşmayı metne dönüştürme REST API'siGitHub'da Ek Örnekler

Bu hızlı başlangıçta Konuşma SDK'sını kullanarak konuşmacı tanımaya yönelik temel tasarım desenlerini öğreneceksiniz, örneğin:

  • Metne bağımlı ve metinden bağımsız doğrulama.
  • Bir ses grubu arasında 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 bölmedeki Başvuru düğümüne bakın.

Önemli

Microsoft, konuşmacı tanımaya erişimi sınırlar. Azure AI Konuşmacı Tanıma Sınırlı Erişim Gözden Geçirme formu aracılığıyla kullanmak için uygulayın. Onaydan sonra Konuşmacı Tanıma API'lerine erişebilirsiniz.

Önkoşullar

Metne bağımlı doğrulama

Konuşmacı doğrulama, konuşmacının bilinen veya kayıtlı bir sesle eşleşdiğini onaylama işlemidir. İlk adım, hizmette gelecekteki ses örneklerini karşılaştıracak bir şey olması için bir ses profili kaydetmektir. Bu örnekte, kayıt ve doğrulama için belirli bir parola gerektiren metne bağımlı bir strateji kullanarak profili kaydedersiniz. Desteklenen parolaların listesi için başvuru belgelerine bakın.

Bir ses profili oluşturarak başlayın. Bu makaledeki curl komutlarının her birine Konuşma hizmeti abonelik anahtarınızı ve bölgenizi eklemeniz gerekir.

Önemli

İşiniz bittiğinde anahtarı kodunuzdan kaldırmayı unutmayın ve asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

# Note Change locale if needed.
curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker-recognition/verification/text-dependent/profiles?api-version=2021-09-05' \
--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
  • Metinden bağımsız doğrulama
  • Metinden bağımsız tanımlama

Bu durumda, metne bağımlı bir doğrulama ses profili oluşturursunuz. Aşağıdaki yanıtı almanız gerekir:

{
    "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 kaydedersiniz. --data-binary Parametre değeri için, bilgisayarınızda desteklenen parolalardan birini içeren bir ses dosyası belirtin( örneğin, "Sesim pasaportum, beni doğrula." Windows Ses Kaydedicisi gibi bir uygulamayla ses dosyası kaydedebilirsiniz. Alternatif olarak , metin okuma özelliğini kullanarak da oluşturabilirsiniz.

curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker-recognition/verification/text-dependent/profiles/INSERT_PROFILE_ID_HERE/enrollments?api-version=2021-09-05' \
--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ı almanız gerekir:

{
    "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ğini daha kaydetmeniz gerektiğini bildirir.

Toplam üç ses örneğini kaydettikten sonra aşağıdaki yanıtı almanız gerekir:

{
    "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 ses profilinde bir ses örneğini doğrulamaya hazı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-recognition/verification/text-dependent/profiles/INSERT_PROFILE_ID_HERE:verify?api-version=2021-09-05' \
--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ı almanız gerekir:

{
    "recognitionResult": "Accept",
    "score": 1.0
}

Accept parolanın eşleşip doğrulamanın başarılı olduğu anlamına gelir. Yanıt ayrıca 0,0 ile 1,0 arasında bir benzerlik puanı içerir.

Bitirmek için ses profilini silin.

curl --location --request DELETE \
'INSERT_ENDPOINT_HERE/speaker-recognition/verification/text-dependent/profiles/INSERT_PROFILE_ID_HERE?api-version=2021-09-05' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE'

Yanıt yok.

Metinden bağımsız doğrulama

Metne bağımlı doğrulamanın aksine, metinden bağımsız doğrulama:

  • Belirli bir şifrenin konuşulması gerekmez. Her şey konuşulabilir.
  • Üç ses örneği gerektirmez, ancak toplam 20 saniye ses gerektirir.

Metinden bağımsız bir doğrulama profili oluşturarak başlayın.

curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker-recognition/verification/text-independent/profiles?api-version=2021-09-05' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: application/json' \
--data-raw '{
    '\''locale'\'':'\''en-us'\''
}'

Aşağıdaki yanıtı almanız gerekir:

{
    "profileStatus": "Inactive",
    "remainingEnrollmentsSpeechLength": 20.0,
    "profileId": "3f85dca9-ffc9-4011-bf21-37fad2beb4d2",
    "locale": "en-us",
    "enrollmentStatus": "Enrolling",
    "createdDateTime": "2020-09-29T16:08:52.409Z",
    "lastUpdatedDateTime": null,
    "enrollmentsCount": 0,
    "enrollmentsLength": 0.0,
    "enrollmentSpeechLength": 0.0
    "modelVersion": null,
}

Ardından ses profilini kaydettirin. Yine üç 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-recognition/verification/text-independent/profiles/INSERT_PROFILE_ID_HERE/enrollments?api-version=2021-09-05' \
--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ı almanız gerekir:

{
    "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 ses profilinde bir ses örneğini doğrulamaya hazırsınız. Bu ses örneğinin parola içermesi gerekmez. Herhangi bir konuşma içerebilir, ancak en az dört saniyelik ses içermelidir.

curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker-recognition/verification/text-independent/profiles/INSERT_PROFILE_ID_HERE:verify?api-version=2021-09-05' \
--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ı almanız gerekir:

{
    "recognitionResult": "Accept",
    "score": 0.9196669459342957
}

Accept doğrulamanın başarılı olduğu anlamına gelir. Yanıt ayrıca 0,0 ile 1,0 arasında bir benzerlik puanı içerir.

Bitirmek için ses profilini silin.

curl --location --request DELETE 'INSERT_ENDPOINT_HERE/speaker-recognition/verification/text-independent/profiles/INSERT_PROFILE_ID_HERE?api-version=2021-09-05' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE'

Yanıt yok.

Konuşmacı belirleme

Konuşmacı belirleme, belirli bir kayıtlı ses grubundan kimin konuştuğunu belirlemek için kullanılır. İşlem, metinden bağımsız doğrulamaya benzer. Temel fark, tek bir profilde doğrulamak yerine aynı anda birden çok ses profiline karşı doğrulama özelliğidir.

Metinden bağımsız bir tanımlama profili oluşturarak başlayın.

# Note Change locale if needed.
curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker-recognition/identification/text-independent/profiles?api-version=2021-09-05' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: application/json' \
--data-raw '{
    '\''locale'\'':'\''en-us'\''
}'

Aşağıdaki yanıtı almanız gerekir:

{
    "profileStatus": "Inactive",
    "remainingEnrollmentsSpeechLengthInSec": 20.0,
    "profileId": "de99ab38-36c8-4b82-b137-510907c61fe8",
    "locale": "en-us",
    "enrollmentStatus": "Enrolling",
    "createdDateTime": "2020-09-22T17:25:48.642Z",
    "lastUpdatedDateTime": null,
    "enrollmentsCount": 0,
    "enrollmentsLengthInSec": 0.0,
    "enrollmentsSpeechLengthInSec": 0.0,
    "modelVersion": null
}

Ardından ses profilini kaydedersiniz. Yine toplam 20 saniyelik ses içeren ses örnekleri göndermeniz gerekir. Bu örneklerin parola içermesi gerekmez.

curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker-recognition/identification/text-independent/profiles/INSERT_PROFILE_ID_HERE/enrollments?api-version=2021-09-05' \
--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ı almanız gerekir:

{
    "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 tanımlamaya hazırsınız. Tanımla komutu, olası ses profili kimliklerinin virgülle ayrılmış bir listesini kabul eder. Bu durumda, daha önce oluşturduğunuz ses profilinin kimliğini geçirirsiniz. İsterseniz, her ses profilinin farklı bir sesten gelen ses örnekleriyle kaydedildiği birden çok ses profili kimliklerini geçirebilirsiniz.

# Profile ids comma seperated list
curl --location --request POST 'INSERT_ENDPOINT_HERE/speaker-recognition/identification/text-independent/profiles:identifySingleSpeaker?api-version=2021-09-05&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ı almanız gerekir:

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ğine en yakın ses profilinin kimliğini içerir. Ayrıca, benzerlik sırasına göre sıralanmış aday ses profillerinin bir listesini içerir.

Bitirmek için ses profilini silin.

curl --location --request DELETE \
'INSERT_ENDPOINT_HERE/speaker-recognition/identification/text-independent/profiles/INSERT_PROFILE_ID_HERE?api-version=2021-09-05' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE'

Yanıt yok.

Konuşma CLI'sı konuşmacı tanımayı destekler, ancak henüz buraya bir kılavuz eklemedik. Başlamak ve kavramlar hakkında bilgi edinmek için lütfen başka bir programlama dili seçin.

Sonraki adımlar