Szybki start: rozpoznawanie i weryfikowanie, kto mówi
Dokumentacja referencyjna | Pakiet (NuGet) | Dodatkowe przykłady w usłudze GitHub
W tym przewodniku Szybki start poznasz podstawowe wzorce projektowania rozpoznawania osoby mówiącej przy użyciu zestawu Speech SDK, w tym:
- Weryfikacja zależna od tekstu i niezależna od tekstu.
- Identyfikacja osoby mówiącej w celu zidentyfikowania próbki głosu wśród grupy głosów.
- Usuwanie profilów głosowych.
Aby zapoznać się z ogólnymi pojęciami dotyczącymi rozpoznawania osoby mówiącej, zobacz artykuł Przegląd . Aby uzyskać listę obsługiwanych platform, zobacz węzeł Odwołanie w okienku po lewej stronie.
Ważne
Firma Microsoft ogranicza dostęp do rozpoznawania osoby mówiącej. Zastosuj, aby używać go za pośrednictwem formularza przeglądu ograniczonego dostępu rozpoznawania osoby mówiącej platformy Azure . Po zatwierdzeniu możesz uzyskać dostęp do interfejsów API rozpoznawania osoby mówiącej.
Wymagania wstępne
- Subskrypcja platformy Azure — utwórz je bezpłatnie.
- w Azure Portal.
- Klucz zasobu usługi Mowa i region. Po wdrożeniu zasobu usługi Mowa wybierz pozycję Przejdź do zasobu , aby wyświetlić klucze i zarządzać nimi. Aby uzyskać więcej informacji na temat zasobów usług Azure AI, zobacz Pobieranie kluczy dla zasobu.
Instalowanie zestawu SDK usługi Mowa
Przed rozpoczęciem należy zainstalować zestaw SPEECH SDK. W zależności od platformy wykonaj następujące instrukcje:
Importowanie zależności
Aby uruchomić przykłady w tym artykule, dołącz następujące using
instrukcje w górnej części skryptu:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
Tworzenie konfiguracji mowy
Aby wywołać usługę rozpoznawania mowy przy użyciu zestawu SPEECH SDK, należy utworzyć SpeechConfig
wystąpienie. W tym przykładzie utworzysz SpeechConfig
wystąpienie przy użyciu klucza subskrypcji i regionu. Utworzysz również podstawowy kod kociołowy do użycia w pozostałej części tego artykułu, który został zmodyfikowany dla różnych dostosowań.
Ważne
Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak Azure Key Vault. Aby uzyskać więcej informacji, zobacz artykuł Dotyczący zabezpieczeń usług Azure AI.
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);
}
}
Weryfikacja zależna od tekstu
Weryfikacja osoby mówiącej jest aktem potwierdzenia, że głośnik pasuje do znanego lub zarejestrowanego głosu. Pierwszym krokiem jest zarejestrowanie profilu głosowego w taki sposób, aby usługa mogła porównać przyszłe próbki głosu. W tym przykładzie zarejestrujesz profil przy użyciu strategii zależnej od tekstu , która wymaga określonego hasła do użycia na potrzeby rejestracji i weryfikacji. Zapoznaj się z dokumentacją referencyjną , aby uzyskać listę obsługiwanych haseł.
Zacznij od utworzenia następującej funkcji w klasie, Program
aby zarejestrować profil głosowy:
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}");
}
}
}
}
W tej funkcji jest to, await client.CreateProfileAsync()
co w rzeczywistości tworzy nowy profil głosowy. Po utworzeniu określ sposób wprowadzania przykładów dźwiękowych przy użyciu AudioConfig.FromDefaultMicrophoneInput()
w tym przykładzie do przechwytywania dźwięku z domyślnego urządzenia wejściowego. Następnie rejestrujesz przykłady audio w while
pętli, która śledzi liczbę pozostałych próbek i które są wymagane do rejestracji. W każdej iteracji client.EnrollProfileAsync(profile, audioInput)
monituje o wypowiadanie hasła do mikrofonu i dodanie przykładu do profilu głosowego.
Po zakończeniu rejestracji wywołaj metodę await SpeakerVerify(config, profile, profileMapping)
, aby zweryfikować utworzony profil. Dodaj inną funkcję, aby zdefiniować SpeakerVerify
element .
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}");
}
W tej funkcji przekazujesz VoiceProfile
właśnie utworzony obiekt, aby zainicjować model w celu zweryfikowania. await speakerRecognizer.RecognizeOnceAsync(model)
Następnie monituje o ponowne wypowiadanie hasła. Tym razem weryfikuje go względem profilu głosowego i zwraca wynik podobieństwa, który waha się od 0,0 do 1,0. Obiekt result
zwraca Accept
również wartość lub Reject
, na podstawie tego, czy hasło jest zgodne.
Następnie zmodyfikuj Main()
funkcję, aby wywołać utworzone nowe funkcje. Należy również pamiętać, że utworzysz element do Dictionary<string, string>
przekazywania przez odwołanie za pośrednictwem wywołań funkcji. Przyczyną tego jest to, że usługa nie zezwala na przechowywanie nazwy czytelnej dla człowieka za pomocą utworzonej VoiceProfile
nazwy i przechowuje tylko numer identyfikacyjny do celów prywatności. VerificationEnroll
W funkcji dodasz do tego słownika wpis o nowo utworzonym identyfikatorze wraz z nazwą tekstową. W scenariuszach tworzenia aplikacji, w których musisz wyświetlić nazwę czytelną dla człowieka, musisz przechowywać to mapowanie gdzieś, ponieważ usługa nie może go przechowywać.
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();
}
Uruchom skrypt. Zostanie wyświetlony monit o wyrażenie "Mój głos jest moim paszportem, zweryfikuj mnie" trzy razy na rejestrację i jeszcze raz na weryfikację. Zwrócony wynik to wynik podobieństwa, którego można użyć do utworzenia własnych progów niestandardowych na potrzeby weryfikacji.
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
Weryfikacja niezależna od tekstu
W przeciwieństwie do weryfikacji zależnej od tekstu weryfikacja niezależna od tekstu nie wymaga trzech próbek dźwiękowych, ale wymaga 20 sekund całkowitej ilości dźwięku.
Wprowadź kilka prostych zmian w funkcji, VerificationEnroll
aby przełączyć się na weryfikację niezależną od tekstu . Najpierw należy zmienić typ weryfikacji na VoiceProfileType.TextIndependentVerification
. Następnie zmień pętlę while
, aby śledzić result.RemainingEnrollmentsSpeechLength
, co będzie nadal monitować o mówienie do 20 sekund dźwięku zostało przechwycone.
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}");
}
}
}
}
Uruchom ponownie program i zwracany jest wynik podobieństwa.
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
Identyfikacja osoby mówiącej
Identyfikacja osoby mówiącej służy do określania , kto mówi z danej grupy zarejestrowanych głosów. Proces jest podobny do weryfikacji niezależnej od tekstu. Główną różnicą jest możliwość weryfikacji pod kątem wielu profilów głosowych jednocześnie, a nie weryfikacji względem jednego profilu.
Utwórz funkcję IdentificationEnroll
do rejestrowania wielu profilów głosowych. Proces rejestracji dla każdego profilu jest taki sam jak proces rejestracji na potrzeby weryfikacji niezależnej od tekstu. Proces wymaga 20 sekund dźwięku dla każdego profilu. Ta funkcja akceptuje listę ciągów profileNames
i utworzy nowy profil głosowy dla każdej nazwy na liście. Funkcja zwraca listę VoiceProfile
obiektów, które są używane w następnej funkcji do identyfikowania osoby mówiącej.
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;
}
Utwórz następującą funkcję SpeakerIdentification
, aby przesłać żądanie identyfikacji. Główną różnicą w tej funkcji w porównaniu z żądaniem weryfikacji osoby mówiącej jest użycie SpeakerIdentificationModel.FromProfiles()
metody , która akceptuje listę VoiceProfile
obiektów.
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}");
}
Main()
Zmień funkcję na następującą. Utworzysz listę ciągów profileNames
, które są przekazywane do IdentificationEnroll()
funkcji. Zostanie wyświetlony monit o utworzenie nowego profilu głosowego dla każdej nazwy na tej liście, aby dodać więcej nazw, aby utworzyć więcej profilów dla znajomych lub współpracowników.
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();
}
Uruchom skrypt. Zostanie wyświetlony monit o rozmowę z rejestracją przykładów głosowych dla pierwszego profilu. Po zakończeniu rejestracji zostanie wyświetlony monit o powtórzenie tego procesu dla każdej nazwy na profileNames
liście. Po zakończeniu każdej rejestracji zostanie wyświetlony monit o rozmowę z nikim . Następnie usługa próbuje zidentyfikować tę osobę z poziomu zarejestrowanych profilów głosowych.
Ten przykład zwraca tylko najbliższe dopasowanie i jego wynik podobieństwa. Aby uzyskać pełną odpowiedź zawierającą pięć pierwszych wyników podobieństwa, dodaj string json = result.Properties.GetProperty(PropertyId.SpeechServiceResponse_JsonResult)
do SpeakerIdentification
funkcji.
Zmiana typu wejścia audio
Przykłady w tym artykule używają domyślnego mikrofonu urządzenia jako danych wejściowych dla przykładów audio. W scenariuszach, w których musisz używać plików audio zamiast danych wejściowych mikrofonu, zmień dowolne wystąpienie, AudioConfig.FromDefaultMicrophoneInput()
aby AudioConfig.FromWavFileInput(path/to/your/file.wav)
przełączyć się na dane wejściowe pliku. Możesz również mieć mieszane dane wejściowe przy użyciu mikrofonu do rejestracji i plików na potrzeby weryfikacji, na przykład.
Usuwanie rejestracji profilów głosowych
Aby usunąć zarejestrowany profil, użyj DeleteProfileAsync()
funkcji w VoiceProfileClient
obiekcie . W poniższej przykładowej funkcji pokazano, jak usunąć profil głosowy ze znanego identyfikatora profilu głosowego:
public static async Task DeleteProfile(SpeechConfig config, string profileId)
{
using (var client = new VoiceProfileClient(config))
{
var profile = new VoiceProfile(profileId);
await client.DeleteProfileAsync(profile);
}
}
Dokumentacja referencyjna | Pakiet (NuGet) | Dodatkowe przykłady w usłudze GitHub
W tym przewodniku Szybki start poznasz podstawowe wzorce projektowania rozpoznawania osoby mówiącej przy użyciu zestawu Speech SDK, w tym:
- Weryfikacja zależna od tekstu i niezależna od tekstu.
- Identyfikacja osoby mówiącej w celu zidentyfikowania próbki głosu wśród grupy głosów.
- Usuwanie profilów głosowych.
Aby zapoznać się z ogólnymi pojęciami dotyczącymi rozpoznawania osoby mówiącej, zobacz artykuł Przegląd . Aby uzyskać listę obsługiwanych platform, zobacz węzeł Odwołanie w okienku po lewej stronie.
Ważne
Firma Microsoft ogranicza dostęp do rozpoznawania osoby mówiącej. Zastosuj, aby używać go za pośrednictwem formularza przeglądu ograniczonego dostępu rozpoznawania osoby mówiącej platformy Azure . Po zatwierdzeniu możesz uzyskać dostęp do interfejsów API rozpoznawania osoby mówiącej.
Wymagania wstępne
- Subskrypcja platformy Azure — utwórz je bezpłatnie.
- w Azure Portal.
- Klucz zasobu usługi Mowa i region. Po wdrożeniu zasobu usługi Mowa wybierz pozycję Przejdź do zasobu , aby wyświetlić klucze i zarządzać nimi. Aby uzyskać więcej informacji na temat zasobów usług Azure AI, zobacz Pobieranie kluczy dla zasobu.
Instalowanie zestawu SDK usługi Mowa
Przed rozpoczęciem należy zainstalować zestaw SPEECH SDK. W zależności od platformy wykonaj następujące instrukcje:
Importowanie zależności
Aby uruchomić przykłady w tym artykule, dodaj następujące instrukcje w górnej części pliku cpp:
#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;
Tworzenie konfiguracji mowy
Aby wywołać usługę rozpoznawania mowy przy użyciu zestawu SPEECH SDK, utwórz klasę SpeechConfig
. Ta klasa zawiera informacje o subskrypcji, takie jak klucz i skojarzony region, punkt końcowy, host lub token autoryzacji.
Ważne
Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak Azure Key Vault. Aby uzyskać więcej informacji, zobacz artykuł Dotyczący zabezpieczeń usług Azure AI.
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;
}
Weryfikacja zależna od tekstu
Weryfikacja osoby mówiącej jest aktem potwierdzenia, że głośnik pasuje do znanego lub zarejestrowanego głosu. Pierwszym krokiem jest zarejestrowanie profilu głosowego w taki sposób, aby usługa mogła porównać przyszłe próbki głosu. W tym przykładzie zarejestrujesz profil przy użyciu strategii zależnej od tekstu , która wymaga określonego hasła do użycia na potrzeby rejestracji i weryfikacji. Zapoznaj się z dokumentacją referencyjną , aby uzyskać listę obsługiwanych haseł.
TextDependentVerification, funkcja
Zacznij od utworzenia TextDependentVerification
funkcji:
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);
}
Ta funkcja tworzy obiekt VoiceProfile za pomocą metody CreateProfileAsync . Istnieją trzy typy:VoiceProfile
- TextIndependentIdentIdentification
- TextDependentVerification
- TextIndependentVerification
W takim przypadku przekazujesz VoiceProfileType::TextDependentVerification
do CreateProfileAsync
elementu .
Następnie wywołasz dwie funkcje pomocnicze, które zdefiniujesz w następnej kolejności, AddEnrollmentsToTextDependentProfile
i SpeakerVerify
. Na koniec wywołaj metodę DeleteProfileAsync , aby wyczyścić profil.
AddEnrollmentsToTextDependentProfile, funkcja
Zdefiniuj następującą funkcję, aby zarejestrować profil głosowy:
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";
}
W tej funkcji rejestrujesz przykłady audio w while
pętli, która śledzi liczbę pozostałych próbek i które są wymagane do rejestracji. W każdej iteracji funkcja EnrollProfileAsync monituje o wypowiadanie hasła do mikrofonu i dodaje przykład do profilu głosowego.
SpeakerVerify, funkcja
Zdefiniuj SpeakerVerify
w następujący sposób:
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";
}
W tej funkcji utworzysz obiekt SpeakerVerificationModel za pomocą metody SpeakerVerificationModel::FromProfile , przekazując utworzony wcześniej obiekt VoiceProfile .
Następnie speechRecognizer::RecognizeOnceAsync monituje o ponowne wypowiadanie hasła. Tym razem weryfikuje go względem profilu głosowego i zwraca wynik podobieństwa, który waha się od 0,0 do 1,0. Obiekt SpeakerRecognitionResult zwraca Accept
również lub Reject
na podstawie tego, czy hasło pasuje.
Weryfikacja niezależna od tekstu
W przeciwieństwie do weryfikacji zależnej od tekstu weryfikacja niezależna od tekstu nie wymaga trzech próbek dźwiękowych, ale wymaga 20 sekund całkowitej ilości dźwięku.
TextIndependentVerification, funkcja
Zacznij od utworzenia TextIndependentVerification
funkcji:
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);
}
Podobnie jak w przypadku TextDependentVerification
funkcji, ta funkcja tworzy obiekt VoiceProfile za pomocą metody CreateProfileAsync .
W takim przypadku przekazujesz VoiceProfileType::TextIndependentVerification
do CreateProfileAsync
elementu .
Następnie wywołasz dwie funkcje pomocnicze: AddEnrollmentsToTextIndependentProfile
, którą zdefiniujesz w następnej kolejności, i SpeakerVerify
, które zostały już zdefiniowane. Na koniec wywołaj metodę DeleteProfileAsync , aby wyczyścić profil.
AddEnrollmentsToTextIndependentProfile
Zdefiniuj następującą funkcję, aby zarejestrować profil głosowy:
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";
}
W tej funkcji rejestrujesz przykłady audio w while
pętli, która śledzi liczbę sekund pozostałych audio i które są wymagane do rejestracji. W każdej iteracji funkcja EnrollProfileAsync monituje o wypowiadanie się w mikrofonie i dodaje przykład do profilu głosowego.
Identyfikacja osoby mówiącej
Identyfikacja osoby mówiącej służy do określania , kto mówi z danej grupy zarejestrowanych głosów. Proces jest podobny do weryfikacji niezależnej od tekstu. Główną różnicą jest możliwość weryfikacji pod kątem wielu profilów głosowych jednocześnie, a nie weryfikacji względem jednego profilu.
TextIndependentIdentIdentification, funkcja
Zacznij od utworzenia TextIndependentIdentification
funkcji:
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);
}
Podobnie jak w przypadku TextDependentVerification
funkcji i TextIndependentVerification
, ta funkcja tworzy obiekt VoiceProfile za pomocą metody CreateProfileAsync .
W takim przypadku przekazujesz VoiceProfileType::TextIndependentIdentification
do CreateProfileAsync
elementu .
Następnie wywołasz dwie funkcje pomocnicze: AddEnrollmentsToTextIndependentProfile
, która została już zdefiniowana, i SpeakerIdentify
, którą zdefiniujesz w następnej kolejności. Na koniec wywołaj metodę DeleteProfileAsync , aby wyczyścić profil.
SpeakerIdentify, funkcja
Zdefiniuj SpeakerIdentify
funkcję w następujący sposób:
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";
}
W tej funkcji utworzysz obiekt SpeakerIdentificationModel za pomocą metody SpeakerIdentificationModel::FromProfiles. SpeakerIdentificationModel::FromProfiles
akceptuje listę obiektów VoiceProfile . W takim przypadku przekazujesz VoiceProfile
utworzony wcześniej obiekt. Jeśli chcesz, możesz przekazać wiele VoiceProfile
obiektów, z których każda została zarejestrowana przy użyciu przykładów dźwiękowych z innego głosu.
Następnie funkcja SpeechRecognizer::RecognizeOnceAsync monituje o ponowne wypowiadanie. Tym razem porównuje twój głos z zarejestrowanymi profilami głosowymi i zwraca najbardziej podobny profil głosowy.
Main, funkcja
Na koniec zdefiniuj main
funkcję w następujący sposób:
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";
}
Ta funkcja wywołuje zdefiniowane wcześniej funkcje. Najpierw tworzy obiekt VoiceProfileClient i obiekt SpeakerRecognizer .
auto speech_config = GetSpeechConfig();
auto client = VoiceProfileClient::FromConfig(speech_config);
auto recognizer = SpeakerRecognizer::FromConfig(speech_config, audio_config);
Obiekt VoiceProfileClient
służy do tworzenia, rejestrowania i usuwania profilów głosowych. Obiekt SpeakerRecognizer
służy do weryfikowania przykładów mowy względem co najmniej jednego zarejestrowanego profilu głosowego.
Zmiana typu wejścia audio
Przykłady w tym artykule używają domyślnego mikrofonu urządzenia jako danych wejściowych dla przykładów audio. W scenariuszach, w których należy używać plików audio zamiast wejścia mikrofonu, zmień następujący wiersz:
auto audio_config = Audio::AudioConfig::FromDefaultMicrophoneInput();
na:
auto audio_config = Audio::AudioConfig::FromWavFileInput("path/to/your/file.wav");
Ewentualnie zastąp dowolne użycie audio_config
elementu Audio::AudioConfig::FromWavFileInput. Możesz również mieć mieszane dane wejściowe przy użyciu mikrofonu do rejestracji i plików na potrzeby weryfikacji, na przykład.
Dokumentacja referencyjna | Pakiet (Go) | Dodatkowe przykłady w usłudze GitHub
W tym przewodniku Szybki start poznasz podstawowe wzorce projektowania rozpoznawania osoby mówiącej przy użyciu zestawu Speech SDK, w tym:
- Weryfikacja zależna od tekstu i niezależna od tekstu.
- Identyfikacja osoby mówiącej w celu zidentyfikowania próbki głosu wśród grupy głosów.
- Usuwanie profilów głosowych.
Aby zapoznać się z ogólnymi pojęciami dotyczącymi rozpoznawania osoby mówiącej, zobacz artykuł Przegląd . Aby uzyskać listę obsługiwanych platform, zobacz węzeł Odwołanie w okienku po lewej stronie.
Ważne
Firma Microsoft ogranicza dostęp do rozpoznawania osoby mówiącej. Zastosuj, aby używać go za pośrednictwem formularza przeglądu ograniczonego dostępu rozpoznawania osoby mówiącej platformy Azure . Po zatwierdzeniu możesz uzyskać dostęp do interfejsów API rozpoznawania osoby mówiącej.
Wymagania wstępne
- Subskrypcja platformy Azure — utwórz je bezpłatnie.
- w Azure Portal.
- Klucz zasobu usługi Mowa i region. Po wdrożeniu zasobu usługi Mowa wybierz pozycję Przejdź do zasobu , aby wyświetlić klucze i zarządzać nimi. Aby uzyskać więcej informacji na temat zasobów usług Azure AI, zobacz Pobieranie kluczy dla zasobu.
Konfigurowanie środowiska
Zainstaluj zestaw SPEECH SDK dla języka Go. Zapoznaj się z przewodnikiem instalacji zestawu SDK , aby uzyskać więcej wymagań
Wykonywanie niezależnej identyfikacji
Wykonaj następujące kroki, aby utworzyć nowy moduł GO.
Otwórz wiersz polecenia, w którym chcesz utworzyć nowy moduł, a następnie utwórz nowy plik o nazwie
independent-identification.go
.Zastąp zawartość
independent-identification.go
poniższym kodem.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') }
W
independent-identification.go
pliku zastąpYourSubscriptionKey
ciąg kluczem zasobu usługi Mowa i zastąp elementYourServiceRegion
regionem zasobu usługi Mowa.Ważne
Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak Azure Key Vault. Aby uzyskać więcej informacji, zobacz artykuł Dotyczący zabezpieczeń usług Azure AI.
Uruchom następujące polecenia, aby utworzyć go.mod
plik, który łączy się z składnikami hostowanymi w usłudze GitHub:
go mod init independent-identification
go get github.com/Microsoft/cognitive-services-speech-sdk-go
Teraz skompiluj i uruchom kod:
go build
go run independent-identification
Przeprowadzanie niezależnej weryfikacji
Wykonaj następujące kroki, aby utworzyć nowy moduł GO.
Otwórz wiersz polecenia, w którym chcesz utworzyć nowy moduł, a następnie utwórz nowy plik o nazwie
independent-verification.go
.Zastąp zawartość
independent-verification.go
poniższym kodem.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') }
W
independent-verification.go
pliku zastąpYourSubscriptionKey
ciąg kluczem zasobu usługi Mowa i zastąp elementYourServiceRegion
regionem zasobu usługi Mowa.
Uruchom następujące polecenia, aby utworzyć go.mod
plik, który łączy się z składnikami hostowanymi w usłudze GitHub:
go mod init independent-verification
go get github.com/Microsoft/cognitive-services-speech-sdk-go
Teraz skompiluj i uruchom kod:
go build
go run independent-verification
Czyszczenie zasobów
Aby usunąć utworzony zasób usługi Mowa, możesz użyć Azure Portal interfejsu wiersza polecenia platformy Azure lub interfejsu wiersza polecenia platformy Azure.
Dokumentacja referencyjna | Dodatkowe przykłady w usłudze GitHub
Zestaw SPEECH SDK dla języka Java obsługuje rozpoznawanie osoby mówiącej, ale jeszcze nie dołączyliśmy tutaj przewodnika. Wybierz inny język programowania, aby rozpocząć pracę i poznać pojęcia, lub zapoznaj się z dokumentacją języka Java i przykładami połączonymi od początku tego artykułu.
Dokumentacja referencyjna | Pakiet (npm) | Dodatkowe przykłady w usłudze GitHub | Kod źródłowy biblioteki
W tym przewodniku Szybki start poznasz podstawowe wzorce projektowania rozpoznawania osoby mówiącej przy użyciu zestawu Speech SDK, w tym:
- Weryfikacja zależna od tekstu i niezależna od tekstu.
- Identyfikacja osoby mówiącej w celu zidentyfikowania próbki głosu wśród grupy głosów.
- Usuwanie profilów głosowych.
Aby zapoznać się z ogólnymi pojęciami dotyczącymi rozpoznawania osoby mówiącej, zobacz artykuł Przegląd . Aby uzyskać listę obsługiwanych platform, zobacz węzeł Odwołanie w okienku po lewej stronie.
Ważne
Firma Microsoft ogranicza dostęp do rozpoznawania osoby mówiącej. Zastosuj, aby używać go za pośrednictwem formularza przeglądu ograniczonego dostępu rozpoznawania osoby mówiącej platformy Azure . Po zatwierdzeniu możesz uzyskać dostęp do interfejsów API rozpoznawania osoby mówiącej.
Wymagania wstępne
- Subskrypcja platformy Azure — utwórz je bezpłatnie.
- w Azure Portal.
- Klucz zasobu usługi Mowa i region. Po wdrożeniu zasobu usługi Mowa wybierz pozycję Przejdź do zasobu , aby wyświetlić klucze i zarządzać nimi. Aby uzyskać więcej informacji na temat zasobów usług Azure AI, zobacz Pobieranie kluczy dla zasobu.
Instalowanie zestawu SDK usługi Mowa
Przed rozpoczęciem należy zainstalować zestaw SPEECH SDK dla języka JavaScript.
W zależności od środowiska docelowego użyj jednego z następujących elementów:
Pobierz i wyodrębnij zestaw SPEECH SDK dla języka JavaScript microsoft.cognitiveservices.speech.sdk.bundle.js pliku. Umieść go w folderze dostępnym dla pliku HTML.
<script src="microsoft.cognitiveservices.speech.sdk.bundle.js"></script>;
Porada
Jeśli używasz przeglądarki internetowej i używasz tagu <script>
, sdk
prefiks nie jest potrzebny. Prefiks sdk
jest aliasem używanym do nazywania modułu require
.
Importowanie zależności
Aby uruchomić przykłady w tym artykule, dodaj następujące instrukcje w górnej części pliku .js:
"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;
Te instrukcje importować wymagane biblioteki i pobierać klucz subskrypcji usługi Mowa i region ze zmiennych środowiskowych. Określają również ścieżki do plików audio, które będą używane w następujących zadaniach.
Ważne
Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak Azure Key Vault. Aby uzyskać więcej informacji, zobacz artykuł Dotyczący zabezpieczeń usług Azure AI.
Tworzenie funkcji pomocnika
Dodaj następującą funkcję pomocnika, aby odczytywać pliki audio do strumieni do użycia przez usługę Mowa:
function GetAudioConfigFromFile (file)
{
return sdk.AudioConfig.fromWavFileInput(fs.readFileSync(file));
}
W tej funkcji użyjesz metod AudioInputStream.createPushStream i AudioConfig.fromStreamInput w celu utworzenia obiektu AudioConfig . Ten AudioConfig
obiekt reprezentuje strumień audio. Podczas następujących zadań użyjesz kilku z tych AudioConfig
obiektów.
Weryfikacja zależna od tekstu
Weryfikacja osoby mówiącej jest aktem potwierdzenia, że głośnik pasuje do znanego lub zarejestrowanego głosu. Pierwszym krokiem jest zarejestrowanie profilu głosowego w taki sposób, aby usługa mogła porównać przyszłe próbki głosu. W tym przykładzie zarejestrujesz profil przy użyciu strategii zależnej od tekstu , która wymaga określonego hasła do użycia na potrzeby rejestracji i weryfikacji. Zapoznaj się z dokumentacją referencyjną , aby uzyskać listę obsługiwanych haseł.
TextDependentVerification, funkcja
Zacznij od utworzenia TextDependentVerification
funkcji.
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);
}
}
}
Ta funkcja tworzy obiekt VoiceProfile z metodą VoiceProfileClient.createProfileAsync . Istnieją trzy typy:VoiceProfile
- TextIndependentIdentIdentification
- TextDependentVerification
- TextIndependentVerification
W takim przypadku przekazujesz VoiceProfileType.TextDependentVerification
do VoiceProfileClient.createProfileAsync
elementu .
Następnie wywołasz dwie funkcje pomocnicze, które zdefiniujesz w następnej kolejności, AddEnrollmentsToTextDependentProfile
i SpeakerVerify
. Na koniec wywołaj metodę VoiceProfileClient.deleteProfileAsync , aby usunąć profil.
AddEnrollmentsToTextDependentProfile, funkcja
Zdefiniuj następującą funkcję, aby zarejestrować profil głosowy:
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);
}
}
W tej funkcji wywołasz funkcję zdefiniowaną GetAudioConfigFromFile
wcześniej, aby utworzyć AudioConfig
obiekty na podstawie przykładów dźwiękowych. Te przykłady audio zawierają hasło, takie jak "Mój głos jest moim paszportem, zweryfikuj mnie". Następnie zarejestrujesz te przykłady audio przy użyciu metody VoiceProfileClient.enrollProfileAsync .
SpeakerVerify, funkcja
Zdefiniuj SpeakerVerify
w następujący sposób:
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);
}
}
W tej funkcji utworzysz obiekt SpeakerVerificationModel za pomocą metody SpeakerVerificationModel.FromProfile, przekazując utworzony wcześniej obiekt VoiceProfile.
Następnie wywołaj metodę SpeechRecognizer.recognizeOnceAsync , aby sprawdzić poprawność przykładu audio zawierającego to samo hasło co zarejestrowane wcześniej próbki audio. SpeechRecognizer.recognizeOnceAsync
Zwraca obiekt SpeakerRecognitionResult , którego score
właściwość zawiera wynik podobieństwa, który waha się od 0,0 do 1,0. Obiekt SpeakerRecognitionResult
zawiera reason
również właściwość typu ResultReason. Jeśli weryfikacja zakończyła się pomyślnie, reason
właściwość powinna mieć wartość RecognizedSpeaker
.
Weryfikacja niezależna od tekstu
W przeciwieństwie do weryfikacji opartej na tekście weryfikacja niezależna od tekstu :
- Nie wymaga podania określonego hasła. Wszystko może być mówione.
- Nie wymaga trzech próbek dźwiękowych , ale wymaga 20 sekund całkowitej ilości dźwięku.
TextIndependentVerification, funkcja
Zacznij od utworzenia TextIndependentVerification
funkcji.
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);
}
}
}
TextDependentVerification
Podobnie jak funkcja, ta funkcja tworzy obiekt VoiceProfile za pomocą metody VoiceProfileClient.createProfileAsync.
W takim przypadku przekazujesz VoiceProfileType.TextIndependentVerification
wartość do .createProfileAsync
Następnie wywołasz dwie funkcje pomocnicze: AddEnrollmentsToTextIndependentProfile
, które zdefiniujesz w następnej kolejności, i SpeakerVerify
, które zostały już zdefiniowane. Na koniec wywołaj metodę VoiceProfileClient.deleteProfileAsync , aby usunąć profil.
AddEnrollmentsToTextIndependentProfile
Zdefiniuj następującą funkcję, aby zarejestrować profil głosowy:
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);
}
}
W tej funkcji wywołasz zdefiniowaną GetAudioConfigFromFile
wcześniej funkcję, aby utworzyć AudioConfig
obiekty na podstawie przykładów dźwiękowych. Następnie zarejestrujesz te przykłady audio przy użyciu metody VoiceProfileClient.enrollProfileAsync .
Identyfikacja osoby mówiącej
Identyfikacja osoby mówiącej służy do określania , kto mówi z danej grupy zarejestrowanych głosów. Proces jest podobny do weryfikacji niezależnej od tekstu. Główną różnicą jest możliwość weryfikowania wielu profilów głosowych jednocześnie, a nie weryfikowania pod kątem pojedynczego profilu.
TextIndependentIdentIfication, funkcja
Zacznij od utworzenia TextIndependentIdentification
funkcji.
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);
}
}
}
Podobnie jak funkcje TextDependentVerification
i TextIndependentVerification
, ta funkcja tworzy obiekt VoiceProfile za pomocą metody VoiceProfileClient.createProfileAsync .
W takim przypadku przekazujesz VoiceProfileType.TextIndependentIdentification
wartość do .VoiceProfileClient.createProfileAsync
Następnie wywołasz dwie funkcje pomocnicze: AddEnrollmentsToTextIndependentProfile
, które zostały już zdefiniowane, i SpeakerIdentify
, które zdefiniujesz w następnej kolejności. Na koniec wywołaj metodę VoiceProfileClient.deleteProfileAsync , aby usunąć profil.
SpeakerIdentify, funkcja
Zdefiniuj SpeakerIdentify
funkcję w następujący sposób:
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);
}
}
W tej funkcji utworzysz obiekt SpeakerIdentificationModel za pomocą metody SpeakerIdentificationModel.fromProfiles , przekazując utworzony wcześniej obiekt VoiceProfile .
Następnie wywołaj metodę SpeechRecognizer.recognizeOnceAsync i przekaż przykład audio.
SpeechRecognizer.recognizeOnceAsync
próbuje zidentyfikować głos dla tego przykładu audio na VoiceProfile
podstawie obiektów użytych do utworzenia obiektu SpeakerIdentificationModel
. Zwraca obiekt SpeakerRecognitionResult , którego profileId
właściwość identyfikuje pasujący VoiceProfile
obiekt , jeśli istnieje, podczas gdy score
właściwość zawiera wynik podobieństwa, który waha się od 0,0 do 1,0.
Funkcja main
Na koniec zdefiniuj main
funkcję w następujący sposób:
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();
Ta funkcja tworzy obiekt VoiceProfileClient , który służy do tworzenia, rejestrowania i usuwania profilów głosowych. Następnie wywołuje zdefiniowane wcześniej funkcje.
Dokumentacja referencyjna | Pakiet (pobierz) | Dodatkowe przykłady w usłudze GitHub
Zestaw SPEECH SDK dla języka Objective-C nie obsługuje rozpoznawania osoby mówiącej. Wybierz inny język programowania lub odwołanie do języka Objective-C i przykłady połączone od początku tego artykułu.
Dokumentacja referencyjna | Pakiet (pobierz) | Dodatkowe przykłady w usłudze GitHub
Zestaw SDK rozpoznawania mowy dla języka Swift nie obsługuje rozpoznawania osoby mówiącej. Wybierz inny język programowania lub odwołanie do języka Swift i przykłady połączone na początku tego artykułu.
Dokumentacja referencyjna | Pakiet (PyPi) | Dodatkowe przykłady w usłudze GitHub
Zestaw SPEECH SDK dla języka Python nie obsługuje rozpoznawania osoby mówiącej. Wybierz inny język programowania lub odwołanie do języka Python i przykłady połączone od początku tego artykułu.
Dokumentacja | interfejsu API REST zamiany mowy na tekstInterfejs API REST zamiany mowy na tekst w celu uzyskania krótkiej dokumentacji | audioDodatkowe przykłady w usłudze GitHub
W tym przewodniku Szybki start poznasz podstawowe wzorce projektowe rozpoznawania osoby mówiącej przy użyciu zestawu SPEECH SDK, w tym:
- Weryfikacja zależna od tekstu i niezależna od tekstu.
- Identyfikacja osoby mówiącej w celu zidentyfikowania próbki głosu wśród grupy głosów.
- Usuwanie profilów głosowych.
Aby zapoznać się z ogólnymi pojęciami dotyczącymi rozpoznawania osoby mówiącej, zobacz artykuł Omówienie . Aby uzyskać listę obsługiwanych platform, zobacz węzeł Odwołanie w okienku po lewej stronie.
Ważne
Firma Microsoft ogranicza dostęp do rozpoznawania osoby mówiącej. Zastosuj, aby używać go za pomocą formularza przeglądu ograniczonego dostępu rozpoznawania osoby mówiącej platformy Azure . Po zatwierdzeniu możesz uzyskać dostęp do interfejsów API rozpoznawania osoby mówiącej.
Wymagania wstępne
- Subskrypcja platformy Azure — utwórz bezpłatnie.
- w Azure Portal.
- Klucz zasobu usługi Mowa i region. Po wdrożeniu zasobu usługi Mowa wybierz pozycję Przejdź do zasobu, aby wyświetlić klucze i zarządzać nimi. Aby uzyskać więcej informacji na temat zasobów usług Azure AI, zobacz Uzyskiwanie kluczy dla zasobu.
Weryfikacja zależna od tekstu
Weryfikacja osoby mówiącej to czynność potwierdzenia, że głośnik pasuje do znanego lub zarejestrowanego głosu. Pierwszym krokiem jest zarejestrowanie profilu głosowego, aby usługa mogła porównać przyszłe próbki głosu z. W tym przykładzie profil zostanie zarejestrowany przy użyciu strategii zależnej od tekstu , która wymaga użycia określonego hasła na potrzeby rejestracji i weryfikacji. Zapoznaj się z dokumentacją referencyjną , aby uzyskać listę obsługiwanych haseł.
Zacznij od utworzenia profilu głosowego. Musisz wstawić klucz subskrypcji usługi Rozpoznawanie mowy i region do każdego z poleceń curl w tym artykule.
Ważne
Pamiętaj, aby usunąć klucz z kodu po zakończeniu i nigdy nie publikować go publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak azure Key Vault. Aby uzyskać więcej informacji, zobacz artykuł Dotyczący zabezpieczeń usług Azure AI.
# 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'\''
}'
Istnieją trzy typy profilów głosowych:
- Weryfikacja zależna od tekstu
- Weryfikacja niezależna od tekstu
- Identyfikacja niezależna od tekstu
W takim przypadku utworzysz profil głosowy weryfikacji zależny od tekstu. Powinna zostać wyświetlona następująca odpowiedź:
{
"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
}
Następnie zarejestrujesz profil głosowy. Dla wartości parametru --data-binary
określ plik audio na komputerze, który zawiera jedno z obsługiwanych haseł, takich jak "Mój głos jest moim paszportem, sprawdź mnie". Plik dźwiękowy można zarejestrować za pomocą aplikacji, takiej jak Rejestrator głosu Windows. Możesz też wygenerować go przy użyciu tekstu na mowę.
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'
Powinna zostać wyświetlona następująca odpowiedź:
{
"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
}
Ta odpowiedź informuje o konieczności zarejestrowania dwóch dodatkowych przykładów dźwiękowych.
Po zarejestrowaniu w sumie trzech przykładów dźwiękowych powinna zostać wyświetlona następująca odpowiedź:
{
"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
}
Teraz możesz zweryfikować przykładowy dźwięk w profilu głosowym. Ten przykład dźwiękowy powinien zawierać takie samo hasło, jak przykłady użyte do zarejestrowania profilu głosowego.
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'
Powinna zostać wyświetlona następująca odpowiedź:
{
"recognitionResult": "Accept",
"score": 1.0
}
Accept
oznacza, że hasło jest dopasowane, a weryfikacja zakończyła się pomyślnie. Odpowiedź zawiera również wynik podobieństwa, który waha się od 0,0 do 1,0.
Aby zakończyć, usuń profil głosowy.
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'
Nie ma odpowiedzi.
Weryfikacja niezależna od tekstu
W przeciwieństwie do weryfikacji zależnej od tekstuweryfikacja niezależna od tekstu :
- Nie wymaga podania określonego hasła. Wszystko może być mówione.
- Nie wymaga trzech próbek dźwiękowych, ale wymaga 20 sekund całkowitego dźwięku.
Zacznij od utworzenia profilu weryfikacji niezależnego od tekstu.
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'\''
}'
Powinna zostać wyświetlona następująca odpowiedź:
{
"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,
}
Następnie zarejestruj profil głosowy. Ponownie, zamiast przesyłać trzy przykłady audio, należy przesłać próbki audio, które zawierają łącznie 20 sekund dźwięku.
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'
Po przesłaniu wystarczającej liczby przykładów dźwiękowych powinna zostać wyświetlona następująca odpowiedź:
{
"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
}
Teraz możesz zweryfikować przykład audio w profilu głosowym. Ponownie ten przykład dźwiękowy nie musi zawierać hasła. Może zawierać dowolną mowę, ale musi zawierać łącznie co najmniej cztery sekundy dźwięku.
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'
Powinna zostać wyświetlona następująca odpowiedź:
{
"recognitionResult": "Accept",
"score": 0.9196669459342957
}
Accept
oznacza, że weryfikacja zakończyła się pomyślnie. Odpowiedź zawiera również wynik podobieństwa, który waha się od 0,0 do 1,0.
Aby zakończyć, usuń profil głosowy.
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'
Nie ma odpowiedzi.
Identyfikacja osoby mówiącej
Identyfikacja osoby mówiącej służy do określania , kto mówi z danej grupy zarejestrowanych głosów. Proces jest podobny do weryfikacji niezależnej od tekstu. Główną różnicą jest możliwość weryfikacji pod kątem wielu profilów głosowych jednocześnie, a nie weryfikacji względem jednego profilu.
Zacznij od utworzenia profilu identyfikacji niezależnego od tekstu.
# 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'\''
}'
Powinna zostać wyświetlona następująca odpowiedź:
{
"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
}
Następnie zarejestruj profil głosowy. Ponownie należy przesłać próbki audio zawierające łącznie 20 sekund dźwięku. Te przykłady nie muszą zawierać hasła.
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'
Po przesłaniu wystarczającej liczby przykładów dźwiękowych powinna zostać wyświetlona następująca odpowiedź:
{
"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
}
Teraz możesz zidentyfikować przykład audio przy użyciu profilu głosowego. Polecenie identify akceptuje rozdzielaną przecinkami listę możliwych identyfikatorów profilów głosowych. W takim przypadku przekażesz identyfikator utworzonego wcześniej profilu głosowego. Jeśli chcesz, możesz przekazać wiele identyfikatorów profilów głosowych, w których każdy profil głosowy jest zarejestrowany przy użyciu przykładów dźwiękowych z innego głosu.
# 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'
Powinna zostać wyświetlona następująca odpowiedź:
Success:
{
"identifiedProfile": {
"profileId": "de99ab38-36c8-4b82-b137-510907c61fe8",
"score": 0.9083486
},
"profilesRanking": [
{
"profileId": "de99ab38-36c8-4b82-b137-510907c61fe8",
"score": 0.9083486
}
]
}
Odpowiedź zawiera identyfikator profilu głosowego, który najlepiej pasuje do przesłanego przykładu audio. Zawiera również listę profilów głosowych kandydatów w kolejności podobieństwa.
Aby zakończyć, usuń profil głosowy.
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'
Nie ma odpowiedzi.
Interfejs wiersza polecenia usługi Mowa obsługuje rozpoznawanie osoby mówiącej, ale jeszcze nie dołączyliśmy tutaj przewodnika. Wybierz inny język programowania, aby rozpocząć pracę i dowiedzieć się więcej o pojęciach.