Introducción a Speaker RecognitionGet started with Speaker Recognition

En este inicio rápido, aprenderá los patrones de diseño básicos de Speaker Recognition mediante el SDK de Voz, que incluyen:In this quickstart, you learn basic design patterns for Speaker Recognition using the Speech SDK, including:

  • Comprobación dependiente e independiente del texto.Text-dependent and text-independent verification
  • Identificación del hablante para identificar una muestra de voz entre un grupo de voces.Speaker identification to identify a voice sample among a group of voices
  • Eliminación de perfiles de voz.Deleting voice profiles

Para obtener una visión general de los conceptos de reconocimiento de voz, consulte el artículo de información general.For a high-level look at Speech Recognition concepts, see the overview article.

Requisitos previosPrerequisites

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz.This article assumes that you have an Azure account and Speech service subscription. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.If you don't have an account and subscription, try the Speech service for free.

Importante

Speaker Recognition solo se admite actualmente en los recursos de Voz de Azure creados en la región de westus.Speaker Recognition is currently only supported in Azure Speech resources created in the westus region.

Instalación de Speech SDKInstall the Speech SDK

En primer lugar, deberá instalar Speech SDK.Before you can do anything, you'll need to install the Speech SDK. Utilice las siguientes instrucciones en función de la plataforma:Depending on your platform, use the following instructions:

Dependencias de importaciónImport dependencies

Para ejecutar los ejemplos de este artículo, incluya las siguientes instrucciones de using al principio del script.To run the examples in this article, include the following using statements at the top of your script.

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;

Creación de una configuración de vozCreate a speech configuration

Para llamar al servicio de voz con Speech SDK, debe crear un elemento SpeechConfig.To call the Speech service using the Speech SDK, you need to create a SpeechConfig. En este ejemplo, se crea un elemento SpeechConfig mediante una clave de suscripción y una región.In this example, you create a SpeechConfig using a subscription key and region. Cree también código reutilizable básico para usarlo en el resto del artículo y que modificará cuando realice distintas personalizaciones.You also create some basic boilerplate code to use for the rest of this article, which you modify for different customizations.

Tenga en cuenta que la región está establecida en westus, ya que es la única región admitida para el servicio.Note that the region is set to westus, as it is the only supported region for the service.

public class Program 
{
    static async Task Main(string[] args)
    {
        // replace with your own subscription key 
        string subscriptionKey = "YourSubscriptionKey";
        string region = "westus";
        var config = SpeechConfig.FromSubscription(subscriptionKey, region);
    }
}

Comprobación dependiente del textoText-dependent verification

Speaker Verification es el acto de confirmar que un hablante coincide con una voz conocida o inscrita .Speaker Verification is the act of confirming that a speaker matches a known, or enrolled voice. El primer paso es inscribir un perfil de voz, de modo que el servicio tenga algo para comparar futuras muestras de voz.The first step is to enroll a voice profile, so that the service has something to compare future voice samples against. En este ejemplo, se inscribe el perfil mediante una estrategia dependiente del texto , que requiere que se use una frase de contraseña específica para la inscripción y la comprobación.In this example, you enroll the profile using a text-dependent strategy, which requires a specific pass-phrase to use for both enrollment and verification. Vea los documentos de referencia para obtener una lista de frases de contraseña admitidas.See the reference docs for a list of supported pass-phrases.

Empiece por crear la siguiente función en la clase Program para inscribir un perfil de voz.Start by creating the following function in your Program class to enroll a voice profile.

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 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, \"My voice is my passport, verify me.\"");
                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}");
            }
        }
    }
}

En esta función, await client.CreateProfileAsync() es lo que crea realmente el nuevo perfil de voz.In this function, await client.CreateProfileAsync() is what actually creates the new voice profile. Una vez creada, debe especificar cómo va a introducir las muestras de audio. En este ejemplo, se usa AudioConfig.FromDefaultMicrophoneInput() para capturar audio del dispositivo de entrada predeterminado.After it is created, you specify how you will input audio samples, using AudioConfig.FromDefaultMicrophoneInput() in this example to capture audio from your default input device. A continuación, debe inscribir muestras de audio en un bucle while que realice un seguimiento del número de muestras restantes y necesarias para la inscripción.Next, you enroll audio samples in a while loop that tracks the number of samples remaining, and required, for enrollment. En cada iteración, client.EnrollProfileAsync(profile, audioInput) le pedirá que diga la frase de contraseña a través del micrófono y agregará la muestra al perfil de voz.In each iteration, client.EnrollProfileAsync(profile, audioInput) will prompt you to speak the pass-phrase into your microphone, and add the sample to the voice profile.

Una vez completada la inscripción, debe llamar a await SpeakerVerify(config, profile, profileMapping) para comprobarla con el perfil que acaba de crear.After enrollment is completed, you call await SpeakerVerify(config, profile, profileMapping) to verify against the profile you just created. Agregue otra función para definir SpeakerVerify.Add another function to define SpeakerVerify.

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

En esta función, se pasa el objeto VoiceProfile que acaba de crear para inicializar un modelo con el que realizar la comprobación.In this function, you pass the VoiceProfile object you just created to initialize a model to verify against. A continuación, await speakerRecognizer.RecognizeOnceAsync(model) le pide que diga de nuevo la frase de contraseña, pero esta vez la validará con el perfil de voz y devolverá una puntuación de similitud comprendida entre 0,0 y 1,0.Next, await speakerRecognizer.RecognizeOnceAsync(model) prompts you to speak the pass-phrase again, but this time it will validate it against your voice profile and return a similarity score ranging from 0.0-1.0. El objeto result también devuelve Accept o Reject, en función de si la frase de contraseña coincide o no.The result object also returns Accept or Reject, based on whether or not the pass-phrase matches.

A continuación, modifique la función Main() para llamar a las nuevas funciones que ha creado.Next, modify your Main() function to call the new functions you created. Además, tenga en cuenta que crea un objeto Dictionary<string, string> para pasar por referencia en las llamadas de función.Additionally, note that you create a Dictionary<string, string> to pass by reference through your function calls. El motivo es que el servicio no permite almacenar un nombre legible con un objeto VoiceProfile creado y solo almacena un número de identificación con fines de privacidad.The reason for this is that the service does not allow storing a human-readable name with a created VoiceProfile, and only stores an ID number for privacy purposes. En la función VerificationEnroll, agrega a este diccionario una entrada con el identificador recién creado, junto con un nombre de texto.In the VerificationEnroll function, you add to this dictionary an entry with the newly created ID, along with a text name. En escenarios de desarrollo de aplicaciones en los que es necesario mostrar un nombre legible, debe almacenar esta asignación en algún lugar, ya que el servicio no puede almacenarla .In application development scenarios where you need to display a human-readable name, you must store this mapping somewhere, the service cannot store it .

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

Ejecute el script y se le pedirá que diga la frase My voice is my passport, verify me (Mi voz es mi pasaporte, verifícame) tres veces para la inscripción y una vez más para la comprobación.Run the script, and you are prompted to speak the phrase My voice is my passport, verify me three times for enrollment, and one additional time for verification. El resultado devuelto es la puntuación de similitud, que puede usar para crear sus propios umbrales personalizados para la comprobación.The result returned is the similarity score, which you can use to create your own custom thresholds for verification.

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

Comprobación independiente del textoText-independent verification

A diferencia de la comprobación dependiente del texto , la comprobación independiente del texto :In contrast to text-dependent verification, text-independent verification:

  • No requiere que se diga una frase de contraseña determinada; se puede decir cualquier cosa.Does not require a certain pass-phrase to be spoken, anything can be spoken
  • No requiere tres muestras de audio, pero 20 segundos de audio total.Does not require three audio samples, but does require 20-seconds of total audio

Realice un par de cambios sencillos en la función VerificationEnroll para cambiar a la comprobación independiente del texto .Make a couple simple changes to your VerificationEnroll function to switch to text-independent verification. En primer lugar, cambie el tipo de comprobación a VoiceProfileType.TextIndependentVerification.First, you change the verification type to VoiceProfileType.TextIndependentVerification. A continuación, cambie el bucle while para realizar un seguimiento de result.RemainingEnrollmentsSpeechLength, que le seguirá solicitando que hable hasta que se hayan capturado 20 segundos de audio.Next, change the while loop to track result.RemainingEnrollmentsSpeechLength, which will continue to prompt you to speak until 20 seconds of audio have been captured.

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 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("Continue speaking to add to the profile enrollment sample.");
                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}");
            }
        }
    }
}

Vuelva a ejecutar el programa y diga cualquier cosa durante la fase de comprobación, ya que no se necesita una frase de contraseña.Run the program again, and speak anything during the verification phase since a pass-phrase is not required. De nuevo, se devuelve la puntuación de similitud.Again, the similarity score is returned.

Enrolling profile id 4tt87d4-f2d3-44ae-b5b4-f1a8d4036ee9.
Continue speaking to add to the profile enrollment sample.
Remaining enrollment audio time needed: 00:00:15.3200000

Continue speaking to add to the profile enrollment sample.
Remaining enrollment audio time needed: 00:00:09.8100008

Continue speaking to add to the profile enrollment sample.
Remaining enrollment audio time needed: 00:00:05.1900000

Continue speaking to add to the profile enrollment sample.
Remaining enrollment audio time needed: 00:00:00.8700000

Continue speaking to add to the profile enrollment sample.
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

Identificación del hablanteSpeaker identification

Speaker Identification se utiliza para determinar quién está hablando de un grupo determinado de voces inscritas.Speaker Identification is used to determine who is speaking from a given group of enrolled voices. El proceso es muy similar al de comprobación independiente del texto . La diferencia principal es que se puede realizar la comprobación con varios perfiles de voz a la vez, en lugar de con uno solo.The process is very similar to text-independent verification , with the main difference being able to verify against multiple voice profiles at once, rather than verifying against a single profile.

Cree una función IdentificationEnroll para inscribir varios perfiles de voz.Create a function IdentificationEnroll to enroll multiple voice profiles. El proceso de inscripción de cada perfil es el mismo que el proceso de inscripción de comprobación independiente del texto y requiere 20 segundos de audio para cada perfil.The enrollment process for each profile is the same as the enrollment process for text-independent verification , and requires 20 seconds of audio for each profile. Esta función acepta una lista de cadenas profileNames y creará un nuevo perfil de voz para cada nombre de la lista.This function accepts a list of strings profileNames, and will create a new voice profile for each name in the list. La función devuelve una lista de objetos VoiceProfile, que se usan en la siguiente función para identificar a un hablante.The function returns a list of VoiceProfile objects, which you use in the next function for identifying a speaker.

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))
    {
        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($"Continue speaking 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;
}

Cree la siguiente función SpeakerIdentification para enviar una solicitud de identificación.Create the following function SpeakerIdentification to submit an identification request. La diferencia principal de esta función con respecto a una solicitud de verificación del hablante es el uso de SpeakerIdentificationModel.FromProfiles(), que acepta una lista de objetos VoiceProfile.The main difference in this function compared to a speaker verification request is the use of SpeakerIdentificationModel.FromProfiles(), which accepts a list of VoiceProfile objects.

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

Cambie la función Main() por lo siguiente.Change your Main() function to the following. Se crea una lista de cadenas profileNames, que debe pasar a la función IdentificationEnroll().You create a list of strings profileNames, which you pass to your IdentificationEnroll() function. Se le pedirá que cree un nuevo perfil de voz para cada nombre de la lista, de modo que puede agregar más nombres para crear perfiles adicionales para amigos o compañeros.This will prompt you to create a new voice profile for each name in this list, so you can add more names to create additional profiles for friends or colleagues.

static async Task Main(string[] args)
{
    // replace with your own subscription key 
    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>();
    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();
}

Ejecute el script y se le pedirá que hable para inscribir las muestras de voz para el primer perfil.Run the script, and you are prompted to speak to enroll voice samples for the first profile. Una vez completada la inscripción, se le pedirá que repita este proceso para cada nombre de la lista profileNames.After the enrollment is completed, you are prompted to repeat this process for each name in the list profileNames. Una vez finalizada la inscripción, se le pedirá que cualquier persona hable y el servicio intentará identificarla entre los perfiles de voz inscritos.After each enrollment is finished, you are prompted to have anyone speak, and the service will attempt to identify this person from among your enrolled voice profiles.

Este ejemplo devuelve solo la coincidencia más cercana y su puntuación de similitud, pero puede obtener la respuesta completa que incluye las cinco mejores puntuaciones de similitud agregando string json = result.Properties.GetProperty(PropertyId.SpeechServiceResponse_JsonResult) a la función SpeakerIdentification.This example returns only the closest match and it's similarity score, but you can get the full response that includes the top five similarity scores by adding string json = result.Properties.GetProperty(PropertyId.SpeechServiceResponse_JsonResult) to your SpeakerIdentification function.

Cambio del tipo de entrada de audioChanging audio input type

En los ejemplos de este artículo se usa el micrófono del dispositivo predeterminado como entrada para las muestras de audio.The examples in this article use the default device microphone as input for audio samples. Sin embargo, en escenarios en los que es necesario usar archivos de audio en lugar de entradas de micrófono, basta con cambiar cualquier instancia de AudioConfig.FromDefaultMicrophoneInput() a AudioConfig.FromWavFileInput(path/to/your/file.wav) para cambiar a una entrada de archivo.However, in scenarios where you need to use audio files instead of microphone input, simply change any instance of AudioConfig.FromDefaultMicrophoneInput() to AudioConfig.FromWavFileInput(path/to/your/file.wav) to switch to a file input. También puede tener entradas mixtas, si usa un micrófono para la inscripción y archivos para la comprobación, por ejemplo.You can also have mixed inputs, using a microphone for enrollment and files for verification, for example.

Eliminación de inscripciones de perfiles de vozDeleting voice profile enrollments

Para eliminar un perfil inscrito, utilice la función DeleteProfileAsync() en el objeto VoiceProfileClient.To delete an enrolled profile, use the DeleteProfileAsync() function on the VoiceProfileClient object. En la función de ejemplo siguiente se muestra cómo eliminar un perfil de voz de un identificador de perfil de voz conocido.The following example function shows how to delete a voice profile from a known voice profile ID.

public static async Task DeleteProfile(SpeechConfig config, string profileId) 
{
    using (var client = new VoiceProfileClient(config))
    {
        var profile = new VoiceProfile(profileId);
        await client.DeleteProfileAsync(profile);
    }
}

En este inicio rápido, aprenderá los patrones de diseño básicos de Speaker Recognition mediante el SDK de Voz, que incluyen:In this quickstart, you learn basic design patterns for Speaker Recognition using the Speech SDK, including:

  • Comprobación dependiente e independiente del texto.Text-dependent and text-independent verification
  • Identificación del hablante para identificar una muestra de voz entre un grupo de voces.Speaker identification to identify a voice sample among a group of voices
  • Eliminación de perfiles de voz.Deleting voice profiles

Para obtener una visión general de los conceptos de reconocimiento de voz, consulte el artículo de información general.For a high-level look at Speech Recognition concepts, see the overview article.

Pasar a los ejemplos en GitHubSkip to samples on GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de C++ en GitHub.If you want to skip straight to sample code, see the C++ quickstart samples on GitHub.

Requisitos previosPrerequisites

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz.This article assumes that you have an Azure account and Speech service subscription. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.If you don't have an account and subscription, try the Speech service for free.

Importante

Speaker Recognition solo se admite actualmente en los recursos de Voz de Azure creados en la región de westus.Speaker Recognition is currently only supported in Azure Speech resources created in the westus region.

Instalación de Speech SDKInstall the Speech SDK

En primer lugar, deberá instalar Speech SDK.Before you can do anything, you'll need to install the Speech SDK. Utilice las siguientes instrucciones en función de la plataforma:Depending on your platform, use the following instructions:

Dependencias de importaciónImport dependencies

Para ejecutar los ejemplos de este artículo, agregue las siguientes instrucciones al principio del archivo .cpp.To run the examples in this article, add the following statements at the top of your .cpp file.

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

Creación de una configuración de vozCreate a speech configuration

Para llamar al servicio de voz con Speech SDK, debe crear un elemento SpeechConfig.To call the Speech service using the Speech SDK, you need to create a SpeechConfig. Esta clase incluye información sobre la suscripción, como la clave, la región asociada, el punto de conexión, el host o el token de autorización.This class includes information about your subscription, like your key and associated region, endpoint, host, or authorization token.

shared_ptr<SpeechConfig> GetSpeechConfig()
{
    char* subscription_key = nullptr;
    char* region = nullptr;
    size_t sz = 0;
    _dupenv_s(&subscription_key, &sz, "SPEECH_SUBSCRIPTION_KEY");
    _dupenv_s(&region, &sz, "SPEECH_REGION");
    if (subscription_key == nullptr) {
        throw std::invalid_argument("Please set the environment variable SPEECH_SUBSCRIPTION_KEY.");
    }
    if (region == nullptr) {
        throw std::invalid_argument("Please set the environment variable SPEECH_REGION.");
    }
    auto config = SpeechConfig::FromSubscription(subscription_key, region);
    free(subscription_key);
    free(region);
    return config;
}

Comprobación dependiente del textoText-dependent verification

Speaker Verification es el acto de confirmar que un hablante coincide con una voz conocida o inscrita.Speaker Verification is the act of confirming that a speaker matches a known, or enrolled voice. El primer paso es inscribir un perfil de voz, de modo que el servicio tenga algo para comparar futuras muestras de voz.The first step is to enroll a voice profile, so that the service has something to compare future voice samples against. En este ejemplo, inscribirá el perfil mediante una estrategia dependiente del texto, que requiere que se use una frase de contraseña específica para la inscripción y la comprobación.In this example, you enroll the profile using a text-dependent strategy, which requires a specific passphrase to use for both enrollment and verification. Consulte los documentos de referencia para ver una lista de frases de contraseña admitidas.See the reference docs for a list of supported passphrases.

Función TextDependentVerificationTextDependentVerification function

Empiece por crear la función TextDependentVerification.Start by creating the TextDependentVerification function.

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

Esta función crea un objeto VoiceProfile con el método CreateProfileAsync.This function creates a VoiceProfile object with the CreateProfileAsync method. Observe que hay tres tipos de VoiceProfile:Note there are three types of VoiceProfile:

  • TextIndependentIdentificationTextIndependentIdentification
  • TextDependentVerificationTextDependentVerification
  • TextIndependentVerificationTextIndependentVerification

En este caso, pasará VoiceProfileType::TextDependentVerification a CreateProfileAsync.In this case you pass VoiceProfileType::TextDependentVerification to CreateProfileAsync.

Luego, llamará a dos funciones auxiliares que definirá a continuación: AddEnrollmentsToTextDependentProfile y SpeakerVerify.You then call two helper functions that you'll define next, AddEnrollmentsToTextDependentProfile and SpeakerVerify. Por último, llame a DeleteProfileAsync para limpiar el perfil.Finally, call DeleteProfileAsync to clean up the profile.

Función AddEnrollmentsToTextDependentProfileAddEnrollmentsToTextDependentProfile function

Defina la función siguiente para inscribir un perfil de voz.Define the following function to enroll a voice profile.

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

Luego, inscribirá muestras de audio en un bucle while que realiza un seguimiento del número de muestras restantes y necesarias para la inscripción.In this function, you enroll audio samples in a while loop that tracks the number of samples remaining, and required, for enrollment. En cada iteración, EnrollProfileAsync le pide que diga la frase de contraseña por el micrófono, y la muestra se agrega al perfil de voz.In each iteration, EnrollProfileAsync prompts you to speak the passphrase into your microphone, and adds the sample to the voice profile.

Función SpeakerVerifySpeakerVerify function

Defina SpeakerVerify como se indica a continuación.Define SpeakerVerify as follows.

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

En esta función, creará un objeto SpeakerVerificationModel con el método SpeakerVerificationModel::FromProfile y pasará el objeto VoiceProfile que creó anteriormente.In this function, you create a SpeakerVerificationModel object with the SpeakerVerificationModel::FromProfile method, passing in the VoiceProfile object you created earlier.

Luego, SpeechRecognizer::RecognizeOnceAsync le pide que diga de nuevo la frase de contraseña, pero esta vez la validará con el perfil de voz y devolverá una puntuación de similitud comprendida entre 0,0 y 1,0.Next, SpeechRecognizer::RecognizeOnceAsync prompts you to speak the passphrase again, but this time it will validate it against your voice profile and return a similarity score ranging from 0.0-1.0. El objeto SpeakerRecognitionResult también devuelve Accept o Reject, según coincida o no la frase de contraseña.The SpeakerRecognitionResult object also returns Accept or Reject, based on whether or not the passphrase matches.

Comprobación independiente del textoText-independent verification

A diferencia de la comprobación dependiente del texto, la comprobación independiente del texto:In contrast to text-dependent verification, text-independent verification:

  • No precisa que se diga una frase de contraseña determinada; se puede decir cualquier cosa.Does not require a certain passphrase to be spoken, anything can be spoken
  • No precisa tres muestras de audio, pero se necesitan 20 segundos de audio total.Does not require three audio samples, but does require 20 seconds of total audio

Función TextIndependentVerificationTextIndependentVerification function

Empiece por crear la función TextIndependentVerification.Start by creating the TextIndependentVerification function.

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

Al igual que la función TextDependentVerification, esta función crea un objeto VoiceProfile con el método CreateProfileAsync.Like the TextDependentVerification function, this function creates a VoiceProfile object with the CreateProfileAsync method.

En este caso, pasará VoiceProfileType::TextIndependentVerification a CreateProfileAsync.In this case you pass VoiceProfileType::TextIndependentVerification to CreateProfileAsync.

Luego, llamará a dos funciones auxiliares: AddEnrollmentsToTextIndependentProfile, que definirá a continuación y SpeakerVerify, que ya ha definido.You then call two helper functions: AddEnrollmentsToTextIndependentProfile, which you'll define next, and SpeakerVerify, which you defined already. Por último, llame a DeleteProfileAsync para limpiar el perfil.Finally, call DeleteProfileAsync to clean up the profile.

AddEnrollmentsToTextIndependentProfileAddEnrollmentsToTextIndependentProfile

Defina la función siguiente para inscribir un perfil de voz.Define the following function to enroll a voice profile.

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

En esta función, inscribirá las muestras de audio en un bucle while que realiza un seguimiento del número de segundos de audio restantes y necesarios para la inscripción.In this function, you enroll audio samples in a while loop that tracks the number of seconds of audio remaining, and required, for enrollment. En cada iteración, EnrollProfileAsync le pide que hable por el micrófono, y la muestra se agrega al perfil de voz.In each iteration, EnrollProfileAsync prompts you to speak into your microphone, and adds the sample to the voice profile.

Identificación del hablanteSpeaker identification

Speaker Identification se utiliza para determinar quién está hablando de un grupo determinado de voces inscritas.Speaker Identification is used to determine who is speaking from a given group of enrolled voices. El proceso es muy similar al de comprobación independiente del texto. La diferencia principal es que se puede realizar la comprobación con varios perfiles de voz a la vez, en lugar de con uno solo.The process is very similar to text-independent verification, with the main difference being able to verify against multiple voice profiles at once, rather than verifying against a single profile.

Función TextIndependentIdentificationTextIndependentIdentification function

Empiece por crear la función TextIndependentIdentification.Start by creating the TextIndependentIdentification function.

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

Al igual que las funciones TextDependentVerification y TextIndependentVerification, esta función crea un objeto VoiceProfile con el método CreateProfileAsync.Like the TextDependentVerification and TextIndependentVerification functions, this function creates a VoiceProfile object with the CreateProfileAsync method.

En este caso, pasará VoiceProfileType::TextIndependentIdentification a CreateProfileAsync.In this case you pass VoiceProfileType::TextIndependentIdentification to CreateProfileAsync.

Luego, llamará a dos funciones auxiliares: AddEnrollmentsToTextIndependentProfile, que ya ha definido y SpeakerIdentify, que definirá a continuación.You then call two helper functions: AddEnrollmentsToTextIndependentProfile, which you defined already, and SpeakerIdentify, which you'll define next. Por último, llame a DeleteProfileAsync para limpiar el perfil.Finally, call DeleteProfileAsync to clean up the profile.

Función SpeakerIdentifySpeakerIdentify function

defina la función SpeakerIdentify de la siguiente manera.Define the SpeakerIdentify function as follows.

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

En esta función, creará un objeto SpeakerIdentificationModel con el método SpeakerIdentificationModel:: FromProfiles.In this function, you create a SpeakerIdentificationModel object with the SpeakerIdentificationModel::FromProfiles method. SpeakerIdentificationModel::FromProfiles acepta una lista de objetos VoiceProfile.SpeakerIdentificationModel::FromProfiles accepts a list of VoiceProfile objects. En este caso, simplemente pasará el objeto VoiceProfile que creó anteriormente.In this case, you'll just pass in the VoiceProfile object you created earlier. Sin embargo, si lo desea, puede pasar varios objetos VoiceProfile, cada uno inscrito con muestras de audio de una voz diferente.However, if you want, you can pass in multiple VoiceProfile objects, each enrolled with audio samples from a different voice.

Luego, SpeechRecognizer::RecognizeOnceAsync le pide que hable de nuevo.Next, SpeechRecognizer::RecognizeOnceAsync prompts you to speak again. Esta vez se compara su voz con los perfiles de voz inscritos y se devuelve el perfil de voz más parecido.This time it compares your voice to the enrolled voice profiles and returns the most similar voice profile.

Función mainMain function

Por último, defina la función main como de la siguiente manera.Finally, define the main function as follows.

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

Esta función simplemente llama a las funciones que definió anteriormente.This function simply calls the functions you defined previously. Sin embargo, primero crea un objeto VoiceProfileClient y un objeto SpeakerRecognizer.First, though, it creates a VoiceProfileClient object and a SpeakerRecognizer object.

auto speech_config = GetSpeechConfig();
auto client = VoiceProfileClient::FromConfig(speech_config);
auto recognizer = SpeakerRecognizer::FromConfig(speech_config, audio_config);

VoiceProfileClient se usa para crear, inscribir y eliminar perfiles de voz.The VoiceProfileClient is used to create, enroll and delete voice profiles. SpeakerRecognizer se utiliza para validar muestras de voz con uno o varios perfiles de voz inscritos.The SpeakerRecognizer is used to validate speech samples against one or more enrolled voice profiles.

Cambio del tipo de entrada de audioChanging audio input type

En los ejemplos de este artículo se usa el micrófono del dispositivo predeterminado como entrada para las muestras de audio.The examples in this article use the default device microphone as input for audio samples. Sin embargo, en escenarios en los que necesite usar archivos de audio en lugar de la entrada de micrófono, solo tiene que cambiar la línea siguiente:However, in scenarios where you need to use audio files instead of microphone input, simply change the following line:

auto audio_config = Audio::AudioConfig::FromDefaultMicrophoneInput();

a:to:

auto audio_config = Audio::AudioConfig::FromWavFileInput(path/to/your/file.wav);

También puede reemplazar el uso de audio_config por Audio::AudioConfig::FromWavFileInput.Or replace any use of audio_config with Audio::AudioConfig::FromWavFileInput. También puede tener entradas mixtas, si usa un micrófono para la inscripción y archivos para la comprobación, por ejemplo.You can also have mixed inputs, using a microphone for enrollment and files for verification, for example.

En este inicio rápido, aprenderá los patrones de diseño básicos de Speaker Recognition mediante el SDK de Voz, que incluyen:In this quickstart, you learn basic design patterns for Speaker Recognition using the Speech SDK, including:

  • Comprobación dependiente e independiente del texto.Text-dependent and text-independent verification
  • Identificación del hablante para identificar una muestra de voz entre un grupo de voces.Speaker identification to identify a voice sample among a group of voices
  • Eliminación de perfiles de voz.Deleting voice profiles

Para obtener una visión general de los conceptos de reconocimiento de voz, consulte el artículo de información general.For a high-level look at Speech Recognition concepts, see the overview article.

Pasar a los ejemplos en GitHubSkip to samples on GitHub

Si quiere pasar directamente al código de ejemplo, consulte los ejemplos del inicio rápido de JavaScript en GitHub.If you want to skip straight to sample code, see the JavaScript quickstart samples on GitHub.

Requisitos previosPrerequisites

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz.This article assumes that you have an Azure account and Speech service subscription. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.If you don't have an account and subscription, try the Speech service for free.

Importante

Speaker Recognition solo se admite actualmente en los recursos de Voz de Azure creados en la región de westus.Speaker Recognition is currently only supported in Azure Speech resources created in the westus region.

Instalación de Speech SDKInstall the Speech SDK

En primer lugar, deberá instalar Speech SDK para JavaScript.Before you can do anything, you'll need to install the Speech SDK for JavaScript . Utilice las siguientes instrucciones en función de la plataforma:Depending on your platform, use the following instructions:

Además, en función del entorno de destino, use una de las siguientes:Additionally, depending on the target environment use one of the following:

Descargue y extraiga el archivo microsoft.cognitiveservices.speech.sdk.bundle.js de Speech SDK para JavaScript y colóquelo en una carpeta accesible para el archivo HTML.Download and extract the Speech SDK for JavaScript microsoft.cognitiveservices.speech.sdk.bundle.js file, and place it in a folder accessible to your HTML file.

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

Sugerencia

Si el destino es un explorador web y usa la etiqueta <script>, el prefijo sdk no es necesario.If you're targeting a web browser, and using the <script> tag; the sdk prefix is not needed. El prefijo sdk es un alias que se usa para asignar un nombre al módulo require.The sdk prefix is an alias used to name the require module.

Dependencias de importaciónImport dependencies

Para ejecutar los ejemplos de este artículo, agregue las siguientes instrucciones al principio del archivo .js.To run the examples in this article, add the following statements at the top of your .js file.

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

const key_var = 'SPEECH_SUBSCRIPTION_KEY';
if (!process.env[key_var]) {
    throw new Error('please set/export the following environment variable: ' + key_var);
}
var subscription_key = process.env[key_var];

const region_var = 'SPEECH_REGION';
if (!process.env[region_var]) {
    throw new Error('please set/export the following environment variable: ' + region_var);
}
var region = process.env[region_var];

const ticks_per_second = 10000000;

Estas instrucciones importan las bibliotecas necesarias y obtienen la clave y región de la suscripción del servicio Voz de las variables de entorno.These statements import the required libraries and get your Speech service subscription key and region from your environment variables. También especifican las rutas de acceso a los archivos de audio que usará en las siguientes tareas.They also specify paths to audio files that you will use in the following tasks.

Creación de funciones de asistenteCreate helper function

Agregue la siguiente función del asistente para leer archivos de audio en secuencias que los usa el servicio Voz.Add the following helper function to read audio files into streams for use by the Speech service.

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

En esta función, se usan los métodos AudioInputStream. createPushStream y AudioConfig. fromStreamInput para crear un objeto AudioConfig.In this function, you use the AudioInputStream.createPushStream and AudioConfig.fromStreamInput methods to create an AudioConfig object. Este objeto AudioConfig representa una secuencia de audio.This AudioConfig object represents an audio stream. En las siguientes tareas, utilizará varios de estos objetos AudioConfig.You will use several of these AudioConfig objects during the following tasks.

Comprobación dependiente del textoText-dependent verification

Speaker Verification es el acto de confirmar que un hablante coincide con una voz conocida o inscrita.Speaker Verification is the act of confirming that a speaker matches a known, or enrolled voice. El primer paso es inscribir un perfil de voz, de modo que el servicio tenga algo para comparar futuras muestras de voz.The first step is to enroll a voice profile, so that the service has something to compare future voice samples against. En este ejemplo, el perfil se inscribe mediante una estrategia dependiente del texto , que requiere que se use una frase de contraseña específica tanto para la inscripción como para la comprobación.In this example, you enroll the profile using a text-dependent strategy, which requires a specific passphrase to use for both enrollment and verification. Consulte los documentos de referencia para ver la lista de las frases de contraseña admitidas.See the reference docs for a list of supported passphrases.

Función TextDependentVerificationTextDependentVerification function

Empiece por crear la función TextDependentVerification.Start by creating the TextDependentVerification function.

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

Esta función crea un objeto VoiceProfile con el método VoiceProfileClient.createProfileAsync.This function creates a VoiceProfile object with the VoiceProfileClient.createProfileAsync method. Observe que hay tres tipos de VoiceProfile:Note there are three types of VoiceProfile:

  • TextIndependentIdentificationTextIndependentIdentification
  • TextDependentVerificationTextDependentVerification
  • TextIndependentVerificationTextIndependentVerification

En este caso, pasará VoiceProfileType.TextDependentVerification a VoiceProfileClient.createProfileAsync.In this case, you pass VoiceProfileType.TextDependentVerification to VoiceProfileClient.createProfileAsync.

Luego, llamará a dos funciones auxiliares que definirá a continuación: AddEnrollmentsToTextDependentProfile y SpeakerVerify.You then call two helper functions that you'll define next, AddEnrollmentsToTextDependentProfile and SpeakerVerify. Por último, llamará a VoiceProfileClient. deleteProfileAsync para quitar el perfil.Finally, call VoiceProfileClient.deleteProfileAsync to remove the profile.

Función AddEnrollmentsToTextDependentProfileAddEnrollmentsToTextDependentProfile function

Defina la función siguiente para inscribir un perfil de voz.Define the following function to enroll a voice profile.

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

En esta función, se llama a la función GetAudioConfigFromFile, que se ha definido anteriormente, para crear objetos AudioConfig a partir de muestras de audio.In this function, you call the GetAudioConfigFromFile function you defined earlier to create AudioConfig objects from audio samples. Estas muestras de audio contienen una frase de contraseña, como "My voice is my passport, verify me".These audio samples contain a passphrase such as "My voice is my passport, verify me." Luego, se inscriben estas muestras de audio mediante el método VoiceProfileClient. enrollProfileAsync.You then enroll these audio samples using the VoiceProfileClient.enrollProfileAsync method.

Función SpeakerVerifySpeakerVerify function

Defina SpeakerVerify como se indica a continuación.Define SpeakerVerify as follows.

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

En esta función, creará un objeto SpeakerVerificationModel con el método SpeakerVerificationModel.FromProfile y pasará el objeto VoiceProfile que creó anteriormente.In this function, you create a SpeakerVerificationModel object with the SpeakerVerificationModel.FromProfile method, passing in the VoiceProfile object you created earlier.

A continuación, llamará al método SpeechRecognizer. recognizeOnceAsync para validar una muestra de audio que contiene la misma frase de contraseña que las muestras de audio que inscribió anteriormente.Next, you call the SpeechRecognizer.recognizeOnceAsync method to validate an audio sample that contains the same passphrase as the audio samples you enrolled previously. SpeechRecognizer.recognizeOnceAsync devuelve un objeto SpeakerRecognitionResult cuya score, propiedad contiene una puntuación de similitud comprendida entre 0,0 y 1,0.SpeechRecognizer.recognizeOnceAsync returns a SpeakerRecognitionResult object, whose score property contains a similarity score ranging from 0.0-1.0. El objeto SpeakerRecognitionResult también contiene una propiedad reason del tipo ResultReason.The SpeakerRecognitionResult object also contains a reason property of type ResultReason. Si la comprobación se realizó correctamente, la propiedad reason debería tener el valor RecognizedSpeaker.If the verification was successful, the reason property should have value RecognizedSpeaker.

Comprobación independiente del textoText-independent verification

A diferencia de la comprobación dependiente del texto , la comprobación independiente del texto :In contrast to text-dependent verification, text-independent verification:

  • No es preciso que se diga una frase de contraseña determinada, se puede decir cualquier cosa.Does not require a certain passphrase to be spoken, anything can be spoken
  • No se necesitan tres muestras de audio, pero 20 segundos de audio en total.Does not require three audio samples, but does require 20 seconds of total audio

Función TextIndependentVerificationTextIndependentVerification function

Empiece por crear la función TextIndependentVerification.Start by creating the TextIndependentVerification function.

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

Al igual que la función TextDependentVerification, esta función crea un objeto VoiceProfile con el método VoiceProfileClient.createProfileAsync.Like the TextDependentVerification function, this function creates a VoiceProfile object with the VoiceProfileClient.createProfileAsync method.

En este caso, pasará VoiceProfileType.TextIndependentVerification a createProfileAsync.In this case, you pass VoiceProfileType.TextIndependentVerification to createProfileAsync.

Luego, llamará a dos funciones auxiliares: AddEnrollmentsToTextIndependentProfile, que definirá a continuación, y SpeakerVerify, que ya ha definido.You then call two helper functions: AddEnrollmentsToTextIndependentProfile, which you'll define next, and SpeakerVerify, which you defined already. Por último, llamará a VoiceProfileClient. deleteProfileAsync para quitar el perfil.Finally, call VoiceProfileClient.deleteProfileAsync to remove the profile.

AddEnrollmentsToTextIndependentProfileAddEnrollmentsToTextIndependentProfile

Defina la función siguiente para inscribir un perfil de voz.Define the following function to enroll a voice profile.

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

En esta función, se llama a la función GetAudioConfigFromFile, que se ha definido anteriormente, para crear objetos AudioConfig a partir de muestras de audio.In this function, you call the GetAudioConfigFromFile function you defined earlier to create AudioConfig objects from audio samples. Luego, se inscriben estas muestras de audio mediante el método VoiceProfileClient. enrollProfileAsync.You then enroll these audio samples using the VoiceProfileClient.enrollProfileAsync method.

Identificación del hablanteSpeaker identification

Speaker Identification se utiliza para determinar quién está hablando de un grupo determinado de voces inscritas.Speaker Identification is used to determine who is speaking from a given group of enrolled voices. El proceso es similar al de comprobación independiente del texto. La diferencia principal es que la comprobación se puede realizar con varios perfiles de voz a la vez, en lugar de con uno solo.The process is similar to text-independent verification , with the main difference being able to verify against multiple voice profiles at once, rather than verifying against a single profile.

Función TextIndependentIdentificationTextIndependentIdentification function

Empiece por crear la función TextIndependentIdentification.Start by creating the TextIndependentIdentification function.

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

Al igual que las funciones TextDependentVerification y TextIndependentVerification, esta función crea un objeto VoiceProfile con el método VoiceProfileClient.createProfileAsync.Like the TextDependentVerification and TextIndependentVerification functions, this function creates a VoiceProfile object with the VoiceProfileClient.createProfileAsync method.

En este caso, pasará VoiceProfileType.TextIndependentIdentification a VoiceProfileClient.createProfileAsync.In this case, you pass VoiceProfileType.TextIndependentIdentification to VoiceProfileClient.createProfileAsync.

Luego, llamará a dos funciones auxiliares: AddEnrollmentsToTextIndependentProfile, que ya ha definido y SpeakerIdentify, que definirá a continuación.You then call two helper functions: AddEnrollmentsToTextIndependentProfile, which you defined already, and SpeakerIdentify, which you'll define next. Por último, llamará a VoiceProfileClient. deleteProfileAsync para quitar el perfil.Finally, call VoiceProfileClient.deleteProfileAsync to remove the profile.

Función SpeakerIdentifySpeakerIdentify function

Defina la función SpeakerIdentify como se indica a continuación.Define the SpeakerIdentify function as follows.

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

En esta función, creará un objeto SpeakerIdentificationModel con el método SpeakerIdentificationModel.fromProfiles y pasará el objeto VoiceProfile que creó anteriormente.In this function, you create a SpeakerIdentificationModel object with the SpeakerIdentificationModel.fromProfiles method, passing in the VoiceProfile object you created earlier.

Luego, llamará al método SpeechRecognizer. recognizeOnceAsync y utilizara una muestra de audio.Next, you call the SpeechRecognizer.recognizeOnceAsync method and pass in an audio sample. SpeechRecognizer.recognizeOnceAsync intentará identificar la voz de esta muestra de audio en función de los objetos VoiceProfile que se usaron para crear SpeakerIdentificationModel.SpeechRecognizer.recognizeOnceAsync tries to identify the voice for this audio sample based on the VoiceProfile objects you used to create the SpeakerIdentificationModel. Devolverá un objeto SpeakerRecognitionResult, cuya propiedad profileId identificará el VoiceProfile coincidente, si hay alguno, mientras que la propiedad score contendrá contiene una puntuación de similitud comprendida entre 0,0 y 1,0.It returns a SpeakerRecognitionResult object, whose profileId property identifies the matching VoiceProfile, if any, while the score property contains a similarity score ranging from 0.0-1.0.

Función mainMain function

Por último, definirá la función main de la sigiuente manera.Finally, define the main function as follows.

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

Esta función crea un objeto VoiceProfileClient, que se usa para crear, inscribir y eliminar perfiles de voz.This function creates a VoiceProfileClient object, which is used to create, enroll, and delete voice profiles. Y, posteriormente, llama a las funciones que definió anteriormente.Then it calls the functions you defined previously.

En este inicio rápido, aprenderá los patrones de diseño básicos de Speaker Recognition mediante el SDK de Voz, que incluyen:In this quickstart, you learn basic design patterns for Speaker Recognition using the Speech SDK, including:

  • Comprobación dependiente e independiente del texto.Text-dependent and text-independent verification
  • Identificación del hablante para identificar una muestra de voz entre un grupo de voces.Speaker identification to identify a voice sample among a group of voices
  • Eliminación de perfiles de voz.Deleting voice profiles

Para obtener una visión general de los conceptos de reconocimiento de voz, consulte el artículo de información general.For a high-level look at Speech Recognition concepts, see the overview article.

Requisitos previosPrerequisites

En este artículo se da por sentado que tiene una cuenta de Azure y una suscripción al servicio de voz.This article assumes that you have an Azure account and Speech service subscription. Si no dispone de una cuenta y una suscripción, pruebe el servicio de voz de forma gratuita.If you don't have an account and subscription, try the Speech service for free.

Importante

Speaker Recognition solo se admite actualmente en los recursos de Voz de Azure creados en la región de westus.Speaker Recognition is currently only supported in Azure Speech resources created in the westus region.

Comprobación dependiente del textoText-dependent verification

Speaker Verification es el acto de confirmar que un hablante coincide con una voz conocida o inscrita.Speaker Verification is the act of confirming that a speaker matches a known, or enrolled voice. El primer paso es inscribir un perfil de voz, de modo que el servicio tenga algo para comparar futuras muestras de voz.The first step is to enroll a voice profile, so that the service has something to compare future voice samples against. En este ejemplo, el perfil se inscribe mediante una estrategia dependiente del texto que requiere que se use una frase de contraseña específica tanto para la inscripción como para la comprobación.In this example, you enroll the profile using a text-dependent strategy, which requires a specific passphrase to use for both enrollment and verification. Consulte los documentos de referencia para ver la lista de las frases de contraseña admitidas.See the reference docs for a list of supported passphrases.

Para empezar, cree un perfil de voz.Start by creating a voice profile. Tendrá que insertar la región y la clave de suscripción del servicio Voz en cada uno de los comandos curl de este artículo.You will need to insert your Speech service subscription key and region into each of the curl commands in this article.

# 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'\''
}'

Hay tres tipos de perfiles de voz:Note there are three types of voice profile:

  • Comprobación dependiente del textoText-dependent verification
  • Comprobación independiente del textoText-independent verification
  • Identificación independiente del textoText-independent identification

En este caso, se crea un perfil de voz de comprobación dependiente del texto.In this case, you create a text-dependent verification voice profile. Debería recibir la respuesta siguiente.You should receive the following response.

{
    "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
}

Luego, se inscribe el perfil de voz.Next, you enroll the voice profile. En el caso del valor del parámetro --data-binary, especifique un archivo de audio en el equipo que contenga una de las frases de contraseña admitidas, como "my voice is my passport, verify me".For the --data-binary parameter value, specify an audio file on your computer that contains one of the supported passphrases, such as "my voice is my passport, verify me." Este tipo de archivo de audio se puede grabar con una aplicación como Windows Voice Recorder, o bien puede generarlo mediante la conversión de texto a voz.You can record such an audio file with an app such as Windows Voice Recorder, or you can generate it using text -to-speech.

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'

Debería recibir la respuesta siguiente.You should receive the following response.

{
    "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
}

Esta respuesta le indica que debe inscribir dos muestras de audio más.This response tells you that you need to enroll two more audio samples.

Cuando haya inscrito un total de tres ejemplos de audio, debe recibir la siguiente respuesta.After you have enrolled a total of three audio samples, you should receive the following response.

{
    "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
}

Ya está listo para comprobar una muestra de audio con el perfil de voz.Now you are ready to verify an audio sample against the voice profile. Esta muestra de audio debe contener la misma frase de contraseña que los ejemplos que usó para inscribir el perfil de voz.This audio sample should contain the same passphrase as the samples you used to enroll the voice profile.

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'

Debería recibir la respuesta siguiente.You should receive the following response.

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

Accept significa que la frase de contraseña coincidía y que la comprobación se realizó correctamente.The Accept means the passphrase matched and the verification was successful. La respuesta también contiene una puntuación de similitud comprendida entre 0,0 y 1,0.The response also contains a similarity score ranging from 0.0-1.0.

Para finalizar, elimine el perfil de voz.To finish, delete the voice profile.

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'

No hay ninguna respuesta.There is no response.

Comprobación independiente del textoText-independent verification

A diferencia de la comprobación dependiente del texto, la comprobación independiente del texto:In contrast to text-dependent verification, text-independent verification:

  • No es preciso que se diga una frase de contraseña determinada, se puede decir cualquier cosa.Does not require a certain passphrase to be spoken, anything can be spoken
  • No se necesitan tres muestras de audio, pero 20 segundos de audio en total.Does not require three audio samples, but does require 20 seconds of total audio

Para empezar, cree un perfil de comprobación independiente del texto.Start by creating a text-independent verification profile.

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'\''
}'

Debería recibir la respuesta siguiente.You should receive the following response.

{
    "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
}

A continuación, inscriba el perfil de voz.Next, enroll the voice profile. De nuevo, en lugar de enviar tres muestras de audio, debe enviar ejemplos de audio que contengan un total de 20 segundos de audio.Again, rather than submitting three audio samples, you need to submit audio samples that contain a total of 20 seconds of audio.

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'

Una vez que haya enviado suficientes muestras de audio, debe recibir la siguiente respuesta.Once you have submitted enough audio samples, you should receive the following response.

{
    "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
}

Ya está listo para comprobar una muestra de audio con el perfil de voz.Now you are ready to verify an audio sample against the voice profile. De nuevo, no es preciso que esta muestra contenga una frase de contraseña.Again, this audio sample does not need to contain a passphrase. Puede contener cualquier locución, siempre que incluya un total de al menos cuatro segundos de audio.It can contain any speech, as long as it contains a total of at least four seconds of audio.

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'

Debería recibir la respuesta siguiente.You should receive the following response.

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

Accept significa que la comprobación se realizó correctamente.The Accept means the verification was successful. La respuesta también contiene una puntuación de similitud comprendida entre 0,0 y 1,0.The response also contains a similarity score ranging from 0.0-1.0.

Para finalizar, elimine el perfil de voz.To finish, delete the voice profile.

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'

No hay ninguna respuesta.There is no response.

Identificación del hablanteSpeaker identification

Speaker Identification se utiliza para determinar quién está hablando de un grupo determinado de voces inscritas.Speaker Identification is used to determine who is speaking from a given group of enrolled voices. El proceso es similar al de comprobación independiente del texto. La diferencia principal es que la comprobación se puede realizar con varios perfiles de voz a la vez, en lugar de con uno solo.The process is similar to text-independent verification, with the main difference being able to verify against multiple voice profiles at once, rather than verifying against a single profile.

Para empezar, cree un perfil de identificación independiente del texto.Start by creating a text-independent identification profile.

# 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'\''
}'

Debería recibir la respuesta siguiente.You should receive the following response.

{
    "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
}

Luego, se inscribe el perfil de voz.Next, you enroll the voice profile. De nuevo, debe enviar muestras de audio que contengan un total de 20 segundos de audio.Again, you need to submit audio samples that contain a total of 20 seconds of audio. No es necesario que estas muestras contengan una frase de contraseña.These samples do not need to contain a passphrase.

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'

Una vez que haya enviado suficientes muestras de audio, debe recibir la siguiente respuesta.Once you have submitted enough audio samples, you should receive the following response.

{
    "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
}

Ya está listo para identificar una muestra de audio mediante el perfil de voz.Now you are ready to identify an audio sample using the voice profile. El comando de identificación acepta una lista delimitada por comas de posibles identificadores del perfil de voz.The identify command accepts a comma-delimited list of possible voice profile IDs. En este caso, solo tendrá que pasar el identificador del perfil de voz que creó anteriormente.In this case, you'll just pass in the ID of the voice profile you created previously. Sin embargo, si lo desea, puede usar varios identificadores de perfil de voz, y cada perfil de voz se inscribe con muestras de audio de una voz diferente.However, if you want, you can pass in multiple voice profile IDs where each voice profile is enrolled with audio samples from a different voice.

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'

Debería recibir la respuesta siguiente.You should receive the following response.

Success:
{
    "identifiedProfile": {
        "profileId": "de99ab38-36c8-4b82-b137-510907c61fe8",
        "score": 0.9083486
    },
    "profilesRanking": [
        {
            "profileId": "de99ab38-36c8-4b82-b137-510907c61fe8",
            "score": 0.9083486
        }
    ]
}

La respuesta contiene el identificador del perfil de voz que más se aproxime al ejemplo de audio que envió.The response contains the ID of the voice profile that most closely matches the audio sample you submitted. También contiene una lista de perfiles de voz candidatos, clasificados por orden de similitud.It also contains a list of candidate voice profiles, ranked in order of similarity.

Para finalizar, elimine el perfil de voz.To finish, delete the voice profile.

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'

No hay ninguna respuesta.There is no response.

Pasos siguientesNext steps