Rychlý start: Rozpoznávání a ověření mluvení
Referenční dokumentace | Balíček (NuGet) | Další ukázky na GitHubu
V tomto rychlém startu se seznámíte se základními vzory návrhu pro rozpoznávání mluvčího pomocí sady Speech SDK, mezi které patří:
- Ověření závislé na textu a nezávislé na textu.
- Identifikace mluvčího k identifikaci vzorku hlasu mezi skupinou hlasů.
- Odstraňují se hlasové profily.
Základní pohled na koncepty rozpoznávání mluvčího najdete v článku Přehled . Seznam podporovaných platforem najdete v uzlu Reference v levém podokně.
Důležité
Microsoft omezuje přístup k rozpoznávání mluvčího. Použijte ho, pokud ho chcete použít prostřednictvím formuláře pro kontrolu omezeného přístupu rozpoznávání mluvčího Azure AI . Po schválení budete mít přístup k rozhraním API pro rozpoznávání mluvčího.
Požadavky
- Předplatné Azure – vytvořte si ho zdarma.
- : Vytvořte prostředek služby Speech v Azure-Portal.
- Klíč a oblast prostředku služby Speech. Po nasazení prostředku služby Speech vyberte Přejít k prostředku a zobrazte a spravujte klíče. Další informace o prostředcích služeb Azure AI najdete v tématu Získání klíčů pro váš prostředek.
Instalace sady Speech SDK
Než začnete, musíte nainstalovat sadu Speech SDK. V závislosti na vaší platformě postupujte podle následujících pokynů:
Import závislostí
Pokud chcete spustit příklady v tomto článku, zahrňte do horní části skriptu následující using
příkazy:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
Vytvoření konfigurace řeči
Pokud chcete volat službu Speech pomocí sady Speech SDK, musíte vytvořit SpeechConfig
instanci. V tomto příkladu SpeechConfig
vytvoříte instanci pomocí klíče předplatného a oblasti. Vytvoříte také základní často používaný kód pro zbytek tohoto článku, který upravíte pro různá přizpůsobení.
Důležité
Až budete hotovi, nezapomeňte klíč z kódu odebrat a nikdy ho nezveřejníte. V produkčním prostředí použijte zabezpečený způsob ukládání a přístupu k přihlašovacím údajům, jako je Azure 密钥保管库. Další informace najdete v článku Zabezpečení služeb 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);
}
}
Ověření závislé na textu
Ověření mluvčího je potvrzení, že mluvčí odpovídá známému nebo zaregistrovanému hlasu. Prvním krokem je registrace hlasového profilu, aby služba byla s čím porovnávat budoucí ukázky hlasových služeb. V tomto příkladu profil zaregistrujete pomocí strategie závislé na textu , která vyžaduje konkrétní přístupové heslo, které se má použít pro registraci a ověření. Seznam podporovaných přístupových hesel najdete v referenční dokumentaci .
Začněte vytvořením následující funkce ve třídě Program
pro registraci hlasového profilu:
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}");
}
}
}
}
V této funkci await client.CreateProfileAsync()
se ve skutečnosti vytvoří nový hlasový profil. Po jeho vytvoření určíte, jak budete zadávat zvukové ukázky. AudioConfig.FromDefaultMicrophoneInput()
V tomto příkladu použijete k zachycení zvuku z výchozího vstupního zařízení. Dále zaregistrujete zvukové ukázky ve smyčce while
, která sleduje počet zbývajících a požadovaných ukázek pro registraci. V každé iteraci client.EnrollProfileAsync(profile, audioInput)
vás nástroj vyzve, abyste vyslovili heslo do mikrofonu, a přidá ukázku do hlasového profilu.
Po dokončení registrace volejte await SpeakerVerify(config, profile, profileMapping)
a ověřte profil, který jste právě vytvořili. Přidejte další funkci pro definování 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}");
}
V této funkci předáte VoiceProfile
objekt, který jste právě vytvořili, abyste inicializovali model pro ověření. await speakerRecognizer.RecognizeOnceAsync(model)
Pak vás vyzve, abyste heslo znovu vyslechli. Tentokrát ho ověří ve vašem hlasovém profilu a vrátí skóre podobnosti v rozsahu od 0,0 do 1,0. Objekt result
také vrátí Accept
nebo Reject
na základě toho, jestli se přístupové heslo shoduje.
Dále upravte Main()
funkci tak, aby volala nové funkce, které jste vytvořili. Všimněte si také, že vytvoříte pro Dictionary<string, string>
předání odkazu prostřednictvím volání funkce. Důvodem je to, že služba neumožňuje ukládání názvu čitelného pro člověka s vytvořeným VoiceProfile
objektem a pro účely ochrany osobních údajů ukládá jenom identifikační číslo. VerificationEnroll
Ve funkci přidáte do tohoto slovníku položku s nově vytvořeným ID a textovým názvem. Ve scénářích vývoje aplikací, kde potřebujete zobrazit lidsky čitelný název, musíte toto mapování někam uložit, protože služba ho nemůže ulož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();
}
Spusťte skript. Třikrát se zobrazí výzva, abyste pro registraci vyslechli frázi "Můj hlas je můj pas, ověřit mě" a ještě jednou pro ověření. Vrácený výsledek je skóre podobnosti, které můžete použít k vytvoření vlastních prahových hodnot pro ověření.
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
Ověření nezávislé na textu
Na rozdíl od ověření závislého na textu nevyžaduje ověření nezávislé na textu tři zvukové vzorky , ale vyžaduje 20 sekund celkového zvuku.
Provedením několika jednoduchých změn funkce VerificationEnroll
přepněte na ověřování nezávislé na textu . Nejprve změníte typ ověření na VoiceProfileType.TextIndependentVerification
. Dále změňte smyčku while
na track (sledovat result.RemainingEnrollmentsSpeechLength
), která bude dál zobrazovat výzvu k mluvení, dokud nebude zachyceno 20 sekund zvuku.
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}");
}
}
}
}
Spusťte program znovu a vrátí se skóre podobnosti.
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
Identifikace mluvčího
Identifikace mluvčího se používá k určení toho, kdo mluví z dané skupiny zaregistrovaných hlasů. Proces je podobný ověřování nezávislému na textu. Hlavním rozdílem je možnost ověření proti více hlasovým profilům najednou, a ne v jednom profilu.
Vytvořte funkci IdentificationEnroll
pro registraci více hlasových profilů. Proces registrace pro každý profil je stejný jako proces registrace pro ověření nezávislé na textu. Tento proces vyžaduje 20 sekund zvuku pro každý profil. Tato funkce přijímá seznam řetězců profileNames
a vytvoří nový hlasový profil pro každé jméno v seznamu. Funkce vrátí seznam VoiceProfile
objektů, který použijete v další funkci k identifikaci mluvčího.
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;
}
Vytvořte následující funkci SpeakerIdentification
, která odešle žádost o identifikaci. Hlavní rozdíl v této funkci oproti žádosti o ověření mluvčíhoSpeakerIdentificationModel.FromProfiles()
VoiceProfile
spočívá v použití , který přijímá seznam objektů.
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}");
}
Změňte Main()
funkci na následující. Vytvoříte seznam řetězců profileNames
, který předáte funkci IdentificationEnroll()
. Zobrazí se výzva k vytvoření nového hlasového profilu pro každé jméno v tomto seznamu, abyste mohli přidat další jména a vytvořit další profily pro přátele nebo kolegy.
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();
}
Spusťte skript. Při registraci hlasových ukázek pro první profil se zobrazí výzva, abyste promluvili. Po dokončení registrace se zobrazí výzva k opakování tohoto procesu pro každé jméno v profileNames
seznamu. Po dokončení každé registrace se zobrazí výzva, aby někdo promluvil. Služba se pak pokusí identifikovat tuto osobu z vašich zaregistrovaných hlasových profilů.
Tento příklad vrátí pouze nejbližší shodu a její skóre podobnosti. Pokud chcete získat úplnou odpověď, která obsahuje prvních pět skóre podobnosti, přidejte string json = result.Properties.GetProperty(PropertyId.SpeechServiceResponse_JsonResult)
do funkce SpeakerIdentification
.
Změna typu zvukového vstupu
V příkladech v tomto článku se jako vstup pro zvukové ukázky používá výchozí mikrofon zařízení. Ve scénářích, kdy potřebujete místo vstupu z mikrofonu použít zvukové soubory, změňte libovolnou instanci AudioConfig.FromDefaultMicrophoneInput()
na a AudioConfig.FromWavFileInput(path/to/your/file.wav)
přepněte na vstup souboru. Můžete také použít smíšené vstupy, například pomocí mikrofonu pro registraci a souborů pro ověření.
Odstranění registrací hlasových profilů
Pokud chcete odstranit zaregistrovaný profil, použijte u objektu DeleteProfileAsync()
VoiceProfileClient
funkci . Následující příklad funkce ukazuje, jak odstranit hlasový profil ze známého ID hlasového profilu:
public static async Task DeleteProfile(SpeechConfig config, string profileId)
{
using (var client = new VoiceProfileClient(config))
{
var profile = new VoiceProfile(profileId);
await client.DeleteProfileAsync(profile);
}
}
Referenční dokumentace | Balíček (NuGet) | Další ukázky na GitHubu
V tomto rychlém startu se seznámíte se základními vzory návrhu pro rozpoznávání mluvčího pomocí sady Speech SDK, mezi které patří:
- Ověření závislé na textu a nezávislé na textu.
- Identifikace mluvčího k identifikaci vzorku hlasu mezi skupinou hlasů.
- Odstraňují se hlasové profily.
Základní pohled na koncepty rozpoznávání mluvčího najdete v článku Přehled . Seznam podporovaných platforem najdete v uzlu Reference v levém podokně.
Důležité
Microsoft omezuje přístup k rozpoznávání mluvčího. Použijte ho, pokud ho chcete použít prostřednictvím formuláře pro kontrolu omezeného přístupu rozpoznávání mluvčího Azure AI . Po schválení budete mít přístup k rozhraním API pro rozpoznávání mluvčího.
Požadavky
- Předplatné Azure – vytvořte si ho zdarma.
- : Vytvořte prostředek služby Speech v Azure-Portal.
- Klíč a oblast prostředku služby Speech. Po nasazení prostředku služby Speech vyberte Přejít k prostředku a zobrazte a spravujte klíče. Další informace o prostředcích služeb Azure AI najdete v tématu Získání klíčů pro váš prostředek.
Instalace sady Speech SDK
Než začnete, musíte nainstalovat sadu Speech SDK. V závislosti na vaší platformě postupujte podle následujících pokynů:
Import závislostí
Pokud chcete spustit příklady v tomto článku, přidejte na začátek souboru .cpp následující příkazy:
#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;
Vytvoření konfigurace řeči
Pokud chcete volat službu Speech pomocí sady Speech SDK, vytvořte SpeechConfig
třídu. Tato třída obsahuje informace o vašem předplatném, jako je klíč a přidružená oblast, koncový bod, hostitel nebo autorizační token.
Důležité
Až budete hotovi, nezapomeňte klíč z kódu odebrat a nikdy ho nezveřejníte. V produkčním prostředí použijte zabezpečený způsob ukládání a přístupu k přihlašovacím údajům, jako je Azure 密钥保管库. Další informace najdete v článku Zabezpečení služeb 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;
}
Ověření závislé na textu
Ověření mluvčího je potvrzení, že mluvčí odpovídá známému nebo zaregistrovanému hlasu. Prvním krokem je registrace hlasového profilu, aby služba byla s čím porovnávat budoucí ukázky hlasových služeb. V tomto příkladu profil zaregistrujete pomocí strategie závislé na textu , která vyžaduje konkrétní přístupové heslo, které se má použít pro registraci a ověření. Seznam podporovaných přístupových hesel najdete v referenční dokumentaci .
Funkce TextDependentVerification
Začněte vytvořením TextDependentVerification
funkce:
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);
}
Tato funkce vytvoří objekt VoiceProfile pomocí metody CreateProfileAsync . Existují tři typyVoiceProfile
:
- TextIndependentIdentification
- TextDependentVerification
- TextIndependentVerification
V tomto případě předáte VoiceProfileType::TextDependentVerification
do CreateProfileAsync
.
Potom zavoláte dvě pomocné funkce, které budete definovat jako další, AddEnrollmentsToTextDependentProfile
a SpeakerVerify
. Nakonec volejte DeleteProfileAsync , abyste profil vyčistili.
Funkce AddEnrollmentsToTextDependentProfile
Definujte následující funkci pro registraci hlasového profilu:
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";
}
V této funkci zaregistrujete zvukové vzorky do while
smyčky, která sleduje počet zbývajících a požadovaných vzorků pro registraci. Při každé iteraci vás Funkce EnrollProfileAsync vyzve, abyste vyslovili heslo do mikrofonu, a přidá ukázku do hlasového profilu.
Funkce SpeakerVerify
Definujte SpeakerVerify
ho takto:
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";
}
V této funkci vytvoříte objekt SpeakerVerificationModel pomocí metody SpeakerVerificationModel::FromProfile a předáte objekt VoiceProfile , který jste vytvořili dříve.
V dalším kroku se speechRecognizer::RecognizeOnceAsync zobrazí výzva, abyste heslo znovu vyslovili. Tentokrát ho ověří ve vašem hlasovém profilu a vrátí skóre podobnosti v rozsahu od 0,0 do 1,0. Objekt SpeakerRecognitionResult také vrátí Accept
nebo Reject
na základě toho, zda heslo odpovídá.
Ověření nezávislé na textu
Na rozdíl od ověření závislého na textu nevyžaduje ověření nezávislé na textu tři zvukové vzorky , ale vyžaduje 20 sekund celkového zvuku.
Funkce TextIndependentVerification
Začněte vytvořením TextIndependentVerification
funkce:
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);
}
TextDependentVerification
Stejně jako funkce vytvoří tato funkce objekt VoiceProfile pomocí metody CreateProfileAsync.
V tomto případě předáte VoiceProfileType::TextIndependentVerification
do CreateProfileAsync
.
Pak zavoláte dvě pomocné funkce: AddEnrollmentsToTextIndependentProfile
, které definujete jako další, a SpeakerVerify
, které jste už definovali. Nakonec volejte DeleteProfileAsync , abyste profil vyčistili.
AddEnrollmentsToTextIndependentProfile
Definujte následující funkci pro registraci hlasového profilu:
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";
}
V této funkci zaregistrujete zvukové vzorky do while
smyčky, která sleduje počet sekund zbývajícího zvuku a to, které jsou potřeba k registraci. Při každé iteraci vás Funkce EnrollProfileAsync vyzve, abyste promluvili do mikrofonu, a přidá ukázku do hlasového profilu.
Identifikace mluvčího
Identifikace mluvčího se používá k určení toho, kdo mluví z dané skupiny zaregistrovaných hlasů. Proces je podobný ověřování nezávislému na textu. Hlavním rozdílem je možnost ověření proti více hlasovým profilům najednou, a ne v jednom profilu.
TextIndependentIdentification – funkce
Začněte vytvořením TextIndependentIdentification
funkce:
void TextIndependentIdentification(shared_ptr<VoiceProfileClient> client, shared_ptr<SpeakerRecognizer> recognizer)
{
std::cout << "Speaker Identification:\n\n";
// Create the profile.
auto profile = client->CreateProfileAsync(VoiceProfileType::TextIndependentIdentification, profile_locale).get();
std::cout << "Created profile ID: " << profile->GetId() << "\n";
AddEnrollmentsToTextIndependentProfile(client, profile);
SpeakerIdentify(profile, recognizer);
// Delete the profile.
client->DeleteProfileAsync(profile);
}
TextDependentVerification
Stejně jako funkce a TextIndependentVerification
vytvoří tato funkce objekt VoiceProfile pomocí metody CreateProfileAsync.
V tomto případě předáte VoiceProfileType::TextIndependentIdentification
do CreateProfileAsync
.
Potom zavoláte dvě pomocné funkce: AddEnrollmentsToTextIndependentProfile
, které jste už definovali, a SpeakerIdentify
, které definujete dále. Nakonec volejte DeleteProfileAsync , abyste profil vyčistili.
Funkce SpeakerIdentify
SpeakerIdentify
Definujte funkci následujícím způsobem:
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";
}
V této funkci vytvoříte Objekt SpeakerIdentificationModel pomocí metody SpeakerIdentificationModel::FromProfiles . SpeakerIdentificationModel::FromProfiles
přijímá seznam objektů VoiceProfile . V tomto případě předáte objekt, který VoiceProfile
jste vytvořili dříve. Pokud chcete, můžete předat více VoiceProfile
objektů, z nichž každý je zaregistrovaný se zvukovými ukázkami z jiného hlasu.
V dalším kroku vás SpeechRecognizer::RecognizeOnceAsync vyzve, abyste znovu mluvili. Tentokrát porovná váš hlas s registrovanými hlasovými profily a vrátí nejvíce podobný hlasový profil.
Hlavní funkce
Nakonec definujte main
funkci následujícím způsobem:
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";
}
Tato funkce volá funkce, které jste definovali dříve. Nejprve vytvoří objekt VoiceProfileClient a Objekt SpeakerRecognizer .
auto speech_config = GetSpeechConfig();
auto client = VoiceProfileClient::FromConfig(speech_config);
auto recognizer = SpeakerRecognizer::FromConfig(speech_config, audio_config);
Objekt slouží VoiceProfileClient
k vytváření, registraci a odstraňování hlasových profilů. Objekt SpeakerRecognizer
se používá k ověření ukázek řeči v jednom nebo více zaregistrovaných hlasových profilech.
Změna typu zvukového vstupu
V příkladech v tomto článku se jako vstup pro zvukové ukázky používá výchozí mikrofon zařízení. Ve scénářích, kdy místo vstupu z mikrofonu potřebujete použít zvukové soubory, změňte následující řádek:
auto audio_config = Audio::AudioConfig::FromDefaultMicrophoneInput();
na
auto audio_config = Audio::AudioConfig::FromWavFileInput("path/to/your/file.wav");
Nebo nahraďte jakékoli použití audio_config
za Audio::AudioConfig::FromWavFileInput. Můžete také použít smíšené vstupy, například pomocí mikrofonu pro registraci a souborů pro ověření.
Referenční dokumentace | Balíček (Go) | Další ukázky na GitHubu
V tomto rychlém startu se seznámíte se základními vzory návrhu pro rozpoznávání mluvčího pomocí sady Speech SDK, mezi které patří:
- Ověření závislé na textu a nezávislé na textu.
- Identifikace mluvčího k identifikaci vzorku hlasu mezi skupinou hlasů.
- Odstraňují se hlasové profily.
Základní pohled na koncepty rozpoznávání mluvčího najdete v článku Přehled . Seznam podporovaných platforem najdete v uzlu Reference v levém podokně.
Důležité
Microsoft omezuje přístup k rozpoznávání mluvčího. Použijte ho, pokud ho chcete použít prostřednictvím formuláře pro kontrolu omezeného přístupu rozpoznávání mluvčího Azure AI . Po schválení budete mít přístup k rozhraním API pro rozpoznávání mluvčího.
Požadavky
- Předplatné Azure – vytvořte si ho zdarma.
- : Vytvořte prostředek služby Speech v Azure-Portal.
- Klíč a oblast prostředku služby Speech. Po nasazení prostředku služby Speech vyberte Přejít k prostředku a zobrazte a spravujte klíče. Další informace o prostředcích služeb Azure AI najdete v tématu Získání klíčů pro váš prostředek.
Nastavení prostředí
Nainstalujte sadu Speech SDK pro Go. Další požadavky najdete v průvodci instalací sady SDK .
Provést nezávislou identifikaci
Podle těchto kroků vytvořte nový modul GO.
Otevřete příkazový řádek, na kterém chcete nový modul použít, a vytvořte nový soubor s názvem
independent-identification.go
.Nahraďte obsah
independent-identification.go
souboru následujícím kódem.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') }
V
independent-identification.go
souboru nahraďteYourSubscriptionKey
klíčem prostředku služby Speech a nahraďteYourServiceRegion
oblastí prostředku služby Speech.Důležité
Až budete hotovi, nezapomeňte klíč z kódu odebrat a nikdy ho nezveřejníte. V produkčním prostředí použijte zabezpečený způsob ukládání a přístupu k přihlašovacím údajům, jako je Azure 密钥保管库. Další informace najdete v článku Zabezpečení služeb Azure AI.
Spuštěním následujících příkazů vytvořte soubor, který odkazuje go.mod
na komponenty hostované na GitHubu:
go mod init independent-identification
go get github.com/Microsoft/cognitive-services-speech-sdk-go
Teď sestavte a spusťte kód:
go build
go run independent-identification
Provést nezávislé ověření
Podle těchto kroků vytvořte nový modul GO.
Otevřete příkazový řádek, na kterém chcete nový modul použít, a vytvořte nový soubor s názvem
independent-verification.go
.Nahraďte obsah
independent-verification.go
souboru následujícím kódem.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') }
V
independent-verification.go
souboru nahraďteYourSubscriptionKey
klíčem prostředku služby Speech a nahraďteYourServiceRegion
oblastí prostředku služby Speech.
Spuštěním následujících příkazů vytvořte soubor, který odkazuje go.mod
na komponenty hostované na GitHubu:
go mod init independent-verification
go get github.com/Microsoft/cognitive-services-speech-sdk-go
Teď sestavte a spusťte kód:
go build
go run independent-verification
Vyčištění prostředků
Vytvořený prostředek služby Speech můžete odebrat pomocí Azure-Portal nebo rozhraní příkazového řádku Azure (CLI).
Referenční dokumentace | Další ukázky na GitHubu
Sada Speech SDK pro Javu sice podporuje rozpoznávání mluvčího, ale zatím jsme sem nezahrnuli příručku. Začněte tím, že vyberete jiný programovací jazyk a seznámíte se s koncepty, nebo se podívejte na referenční informace o Javě a ukázky uvedené na začátku tohoto článku.
Referenční dokumentace | Balíček (npm) | Další ukázky na GitHubu | Zdrojový kód knihovny
V tomto rychlém startu se seznámíte se základními vzory návrhu pro rozpoznávání mluvčího pomocí sady Speech SDK, mezi které patří:
- Ověření závislé na textu a nezávislé na textu.
- Identifikace mluvčího k identifikaci vzorku hlasu mezi skupinou hlasů.
- Odstraňují se hlasové profily.
Základní pohled na koncepty rozpoznávání mluvčího najdete v článku Přehled . Seznam podporovaných platforem najdete v uzlu Reference v levém podokně.
Důležité
Microsoft omezuje přístup k rozpoznávání mluvčího. Použijte ho, pokud ho chcete použít prostřednictvím formuláře pro kontrolu omezeného přístupu rozpoznávání mluvčího Azure AI . Po schválení budete mít přístup k rozhraním API pro rozpoznávání mluvčího.
Požadavky
- Předplatné Azure – vytvořte si ho zdarma.
- : Vytvořte prostředek služby Speech v Azure-Portal.
- Klíč a oblast prostředku služby Speech. Po nasazení prostředku služby Speech vyberte Přejít k prostředku a zobrazte a spravujte klíče. Další informace o prostředcích služeb Azure AI najdete v tématu Získání klíčů pro váš prostředek.
Instalace sady Speech SDK
Než začnete, musíte nainstalovat sadu Speech SDK pro JavaScript.
V závislosti na cílovém prostředí použijte jednu z následujících možností:
Stáhněte a extrahujte microsoft.cognitiveservices.speech.sdk.bundle.js soubor sady Speech SDK pro JavaScript. Umístěte ho do složky přístupné vašemu souboru HTML.
<script src="microsoft.cognitiveservices.speech.sdk.bundle.js"></script>;
Tip
Pokud cílíte na webový prohlížeč a používáte <script>
značku , sdk
není předpona potřeba. Předpona sdk
je alias, který slouží k pojmenování require
modulu.
Import závislostí
Příklady v tomto článku spustíte tak, že na začátek souboru .js přidáte následující příkazy:
"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;
Tyto příkazy importují požadované knihovny a získávají klíč a oblast předplatného služby Speech z proměnných prostředí. Určují také cesty ke zvukovým souborům, které použijete v následujících úlohách.
Důležité
Až budete hotovi, nezapomeňte klíč z kódu odebrat a nikdy ho nezveřejníte. V produkčním prostředí použijte zabezpečený způsob ukládání a přístupu k přihlašovacím údajům, jako je Azure 密钥保管库. Další informace najdete v článku Zabezpečení služeb Azure AI.
Vytvoření pomocné funkce
Přidejte následující pomocnou funkci pro čtení zvukových souborů do datových proudů pro použití službou Speech:
function GetAudioConfigFromFile (file)
{
return sdk.AudioConfig.fromWavFileInput(fs.readFileSync(file));
}
V této funkci použijete metody AudioInputStream.createPushStream a AudioConfig.fromStreamInput k vytvoření objektu AudioConfig . Tento AudioConfig
objekt představuje zvukový stream. Několik z těchto AudioConfig
objektů použijete během následujících úloh.
Ověření závislé na textu
Ověření mluvčího je potvrzení, že mluvčí odpovídá známému nebo zaregistrovanému hlasu. Prvním krokem je registrace hlasového profilu, aby služba byla s čím porovnávat budoucí ukázky hlasových služeb. V tomto příkladu profil zaregistrujete pomocí strategie závislé na textu , která vyžaduje konkrétní přístupové heslo, které se má použít pro registraci a ověření. Seznam podporovaných přístupových hesel najdete v referenční dokumentaci .
Funkce TextDependentVerification
Začněte vytvořením TextDependentVerification
funkce .
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);
}
}
}
Tato funkce vytvoří objekt VoiceProfile pomocí metody VoiceProfileClient.createProfileAsync . Existují tři typyVoiceProfile
:
- TextIndependentIdentification
- TextDependentVerification
- TextIndependentVerification
V tomto případě předáte VoiceProfileType.TextDependentVerification
do VoiceProfileClient.createProfileAsync
.
Potom zavoláte dvě pomocné funkce, které budete definovat jako další, AddEnrollmentsToTextDependentProfile
a SpeakerVerify
. Nakonec zavolejte VoiceProfileClient.deleteProfileAsync a odeberte profil.
Funkce AddEnrollmentsToTextDependentProfile
Definujte následující funkci pro registraci hlasového profilu:
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);
}
}
V této funkci zavoláte GetAudioConfigFromFile
funkci, kterou jste definovali dříve, abyste vytvořili AudioConfig
objekty ze zvukových ukázek. Tyto zvukové ukázky obsahují přístupové heslo, například "Můj hlas je můj pas, ověřte mě". Tyto zvukové ukázky pak zaregistrujete pomocí metody VoiceProfileClient.enrollProfileAsync .
Funkce SpeakerVerify
Definujte SpeakerVerify
ho takto:
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);
}
}
V této funkci vytvoříte objekt SpeakerVerificationModel pomocí metody SpeakerVerificationModel.FromProfile a předáte objekt VoiceProfile , který jste vytvořili dříve.
Dále zavoláte metodu SpeechRecognizer.recognizeOnceAsync k ověření zvukové ukázky, která obsahuje stejné heslo jako zvukové ukázky, které jste zaregistrovali dříve. SpeechRecognizer.recognizeOnceAsync
vrátí SpeakerRecognitionResult objekt, jehož score
vlastnost obsahuje skóre podobnosti v rozsahu od 0.0 do 1.0. Objekt SpeakerRecognitionResult
obsahuje reason
také vlastnost typu ResultReason. Pokud bylo ověření úspěšné, reason
vlastnost by měla mít hodnotu RecognizedSpeaker
.
Ověření nezávislé na textu
Na rozdíl od ověření závislého na textu , ověření nezávislé na textu :
- Nevyžaduje vyslovení určitého přístupového hesla. Mluvit se dá cokoliv.
- Nevyžaduje tři zvukové ukázky , ale vyžaduje 20 sekund celkového zvuku.
Funkce TextIndependentVerification
Začněte vytvořením TextIndependentVerification
funkce .
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
Podobně jako funkce vytvoří tato funkce objekt VoiceProfile pomocí metody VoiceProfileClient.createProfileAsync.
V tomto případě předáte VoiceProfileType.TextIndependentVerification
do createProfileAsync
.
Pak zavoláte dvě pomocné funkce: AddEnrollmentsToTextIndependentProfile
, které definujete jako další, a SpeakerVerify
, které jste už definovali. Nakonec zavolejte VoiceProfileClient.deleteProfileAsync a odeberte profil.
AddEnrollmentsToTextIndependentProfile
Definujte následující funkci pro registraci hlasového profilu:
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);
}
}
V této funkci zavoláte GetAudioConfigFromFile
funkci, kterou jste definovali dříve, abyste vytvořili AudioConfig
objekty ze zvukových ukázek. Tyto zvukové ukázky pak zaregistrujete pomocí metody VoiceProfileClient.enrollProfileAsync .
Identifikace mluvčího
Identifikace mluvčího se používá k určení toho, kdo mluví z dané skupiny zaregistrovaných hlasů. Proces je podobný ověřování nezávislému na textu. Hlavním rozdílem je možnost ověření proti více hlasovým profilům najednou, a ne v jednom profilu.
TextIndependentIdentification – funkce
Začněte vytvořením TextIndependentIdentification
funkce .
async function TextIndependentIdentification(client, speech_config)
{
console.log ("Text Independent Identification:\n");
var profile = null;
try {
const type = sdk.VoiceProfileType.TextIndependentIdentification;
// Create the profile.
profile = await client.createProfileAsync(type, profile_locale);
console.log ("Created profile ID: " + profile.profileId);
// Get the activation phrases
await GetActivationPhrases(type, profile_locale);
await AddEnrollmentsToTextIndependentProfile(client, profile, [identify_file]);
const audio_config = GetAudioConfigFromFile(passphrase_files[0]);
const recognizer = new sdk.SpeakerRecognizer(speech_config, audio_config);
await SpeakerIdentify(profile, recognizer);
}
catch (error) {
console.log ("Error:\n" + error);
}
finally {
if (profile !== null) {
console.log ("Deleting profile ID: " + profile.profileId);
const deleteResult = await client.deleteProfileAsync (profile);
}
}
}
TextDependentVerification
Stejně jako funkce a TextIndependentVerification
vytvoří tato funkce objekt VoiceProfile pomocí metody VoiceProfileClient.createProfileAsync.
V tomto případě předáte VoiceProfileType.TextIndependentIdentification
do VoiceProfileClient.createProfileAsync
.
Potom zavoláte dvě pomocné funkce: AddEnrollmentsToTextIndependentProfile
, které jste už definovali, a SpeakerIdentify
, které definujete dále. Nakonec zavolejte VoiceProfileClient.deleteProfileAsync a odeberte profil.
Funkce SpeakerIdentify
SpeakerIdentify
Definujte funkci následujícím způsobem:
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);
}
}
V této funkci vytvoříte objekt SpeakerIdentificationModel pomocí metody SpeakerIdentificationModel.fromProfiles a předáte objekt VoiceProfile , který jste vytvořili dříve.
Dále zavoláte metodu SpeechRecognizer.recognizeOnceAsync a předáte vzorek zvuku.
SpeechRecognizer.recognizeOnceAsync
se pokusí identifikovat hlas pro tuto ukázku zvuku VoiceProfile
na základě objektů, které jste použili k vytvoření objektu SpeakerIdentificationModel
. Vrátí SpeakerRecognitionResult objekt, jehož profileId
vlastnost identifikuje odpovídající VoiceProfile
, pokud existuje, zatímco score
vlastnost obsahuje skóre podobnosti v rozsahu od 0,0 do 1,0.
Hlavní funkce
Nakonec definujte main
funkci následujícím způsobem:
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();
Tato funkce vytvoří objekt VoiceProfileClient , který slouží k vytváření, registraci a odstraňování hlasových profilů. Potom zavolá funkce, které jste definovali dříve.
Referenční dokumentace | Balíček (stáhnout) | Další ukázky na GitHubu
Sada Speech SDK pro Objective-C nepodporuje rozpoznávání mluvčího. Vyberte jiný programovací jazyk nebo odkaz Objective-C a ukázky propojené od začátku tohoto článku.
Referenční dokumentace | Balíček (stáhnout) | Další ukázky na GitHubu
Sada Speech SDK pro Swift nepodporuje rozpoznávání mluvčího. Vyberte jiný programovací jazyk nebo referenční informace a ukázky Swiftu propojené od začátku tohoto článku.
Referenční dokumentace | Balíček (PyPi) | Další ukázky na GitHubu
Sada Speech SDK pro Python nepodporuje rozpoznávání mluvčího. Vyberte jiný programovací jazyk nebo referenční informace o Pythonu a ukázky, na které odkazujeme na začátku tohoto článku.
Referenční informace | k rozhraní REST API pro převod řeči na textRozhraní REST API pro převod řeči na text pro krátkou referenci | zvukuDalší ukázky na GitHubu
V tomto rychlém startu se seznámíte se základními vzory návrhu pro rozpoznávání mluvčího pomocí sady Speech SDK, mezi které patří:
- Ověření závislé na textu a nezávislé na textu.
- Identifikace mluvčího k identifikaci vzorku hlasu mezi skupinou hlasů.
- Odstraňují se hlasové profily.
Základní pohled na koncepty rozpoznávání mluvčího najdete v článku Přehled . Seznam podporovaných platforem najdete v uzlu Reference v levém podokně.
Důležité
Microsoft omezuje přístup k rozpoznávání mluvčího. Použijte ho, pokud ho chcete použít prostřednictvím formuláře pro kontrolu omezeného přístupu rozpoznávání mluvčího Azure AI . Po schválení budete mít přístup k rozhraním API pro rozpoznávání mluvčího.
Požadavky
- Předplatné Azure – vytvořte si ho zdarma.
- : Vytvořte prostředek služby Speech v Azure-Portal.
- Klíč a oblast prostředku služby Speech. Po nasazení prostředku služby Speech vyberte Přejít k prostředku a zobrazte a spravujte klíče. Další informace o prostředcích služeb Azure AI najdete v tématu Získání klíčů pro váš prostředek.
Ověření závislé na textu
Ověření mluvčího je potvrzení, že mluvčí odpovídá známému nebo zaregistrovanému hlasu. Prvním krokem je registrace hlasového profilu, aby služba byla s čím porovnávat budoucí ukázky hlasových služeb. V tomto příkladu profil zaregistrujete pomocí strategie závislé na textu , která vyžaduje konkrétní přístupové heslo, které se má použít pro registraci a ověření. Seznam podporovaných přístupových hesel najdete v referenční dokumentaci .
Začněte vytvořením hlasového profilu. Do každého příkazu curl v tomto článku budete muset vložit klíč předplatného a oblast služby Speech.
Důležité
Až budete hotovi, nezapomeňte klíč z kódu odebrat a nikdy ho nezveřejníte. V produkčním prostředí použijte zabezpečený způsob ukládání a přístupu k přihlašovacím údajům, jako je Azure 密钥保管库. Další informace najdete v článku Zabezpečení služeb 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'\''
}'
Existují tři typy hlasových profilů:
- Ověření závislé na textu
- Ověření nezávislé na textu
- Identifikace nezávislá na textu
V takovém případě vytvoříte hlasový profil pro ověření závislý na textu. Měla by se zobrazit následující odpověď:
{
"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
}
V dalším kroku zaregistrujete hlasový profil. Jako hodnotu parametru --data-binary
zadejte zvukový soubor v počítači, který obsahuje jednu z podporovaných přístupových hesel, například "Můj hlas je můj pas, ověřte mě". Zvukový soubor můžete nahrát pomocí aplikace, jako je Windows Hlasový záznam. Nebo ho můžete vygenerovat pomocí převodu textu na řeč.
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'
Měla by se zobrazit následující odpověď:
{
"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
}
Z této odpovědi se dozvíte, že je potřeba zaregistrovat další dvě zvukové ukázky.
Po registraci celkem tří zvukových ukázek byste měli obdržet následující odpověď:
{
"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
}
Teď jste připraveni ověřit vzorek zvuku v hlasovém profilu. Tato ukázka zvuku by měla obsahovat stejné heslo jako ukázky, které jste použili k registraci hlasového profilu.
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'
Měla by se zobrazit následující odpověď:
{
"recognitionResult": "Accept",
"score": 1.0
}
Accept
znamená, že heslo bylo spárováno a ověření proběhlo úspěšně. Odpověď také obsahuje skóre podobnosti v rozsahu od 0,0 do 1,0.
Dokončete odstranění hlasového profilu.
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'
Není na to žádná odpověď.
Ověření nezávislé na textu
Na rozdíl od ověření závislého na textu , ověření nezávislé na textu :
- Nevyžaduje vyslovení určitého přístupového hesla. Můžete mluvit o čemkoli.
- Nevyžaduje tři zvukové ukázky , ale vyžaduje 20 sekund celkového zvuku.
Začněte vytvořením ověřovacího profilu nezávislého na textu.
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'\''
}'
Měla by se zobrazit následující odpověď:
{
"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,
}
V dalším kroku zaregistrujte hlasový profil. Opět platí, že místo odeslání tří zvukových ukázek musíte odeslat zvukové ukázky, které obsahují celkem 20 sekund zvuku.
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 odeslání dostatečného množství zvukových ukázek byste měli obdržet následující odpověď:
{
"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
}
Teď jste připravení ověřit vzorek zvuku pro hlasový profil. Opět platí, že tato ukázka zvuku nemusí obsahovat přístupové heslo. Může obsahovat libovolnou řeč, ale musí obsahovat celkem alespoň čtyři sekundy zvuku.
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'
Měla by se zobrazit následující odpověď:
{
"recognitionResult": "Accept",
"score": 0.9196669459342957
}
Accept
znamená, že ověření proběhlo úspěšně. Odpověď také obsahuje skóre podobnosti v rozsahu od 0,0 do 1,0.
Dokončete odstraněním hlasového profilu.
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'
Nepřišla odpověď.
Identifikace mluvčího
Identifikace mluvčího se používá k určení toho, kdo mluví z dané skupiny zaregistrovaných hlasů. Proces je podobný ověřování nezávislému na textu. Hlavním rozdílem je možnost ověření proti více hlasovým profilům najednou, a ne v jednom profilu.
Začněte vytvořením identifikačního profilu nezávislého na textu.
# 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'\''
}'
Měla by se zobrazit následující odpověď:
{
"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
}
V dalším kroku zaregistrujete hlasový profil. Opět musíte odeslat zvukové ukázky, které obsahují celkem 20 sekund zvuku. Tyto ukázky nemusí obsahovat přístupové heslo.
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 odeslání dostatečného množství zvukových ukázek byste měli obdržet následující odpověď:
{
"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
}
Teď můžete pomocí hlasového profilu identifikovat vzorek zvuku. Příkaz identify přijímá seznam možných ID hlasových profilů oddělených čárkami. V takovém případě předáte ID hlasového profilu, který jste vytvořili dříve. Pokud chcete, můžete předat několik ID hlasových profilů, ve kterých je každý hlasový profil zaregistrovaný se zvukovými ukázkami z jiného hlasu.
# 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'
Měla by se zobrazit následující odpověď:
Success:
{
"identifiedProfile": {
"profileId": "de99ab38-36c8-4b82-b137-510907c61fe8",
"score": 0.9083486
},
"profilesRanking": [
{
"profileId": "de99ab38-36c8-4b82-b137-510907c61fe8",
"score": 0.9083486
}
]
}
Odpověď obsahuje ID hlasového profilu, které nejvíce odpovídá zvukové ukázce, kterou jste odeslali. Obsahuje také seznam kandidátských hlasových profilů seřazených podle podobnosti.
Dokončete odstraněním hlasového profilu.
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'
Nepřišla odpověď.
Rozhraní příkazového řádku služby Speech podporuje rozpoznávání mluvčího, ale zatím jsme sem nezahrnuli průvodce. Začněte tím, že vyberete jiný programovací jazyk a seznámíte se s koncepty.