Jak rozpoznawać mowę
Dokumentacja referencyjna Package (NuGet) | Dodatkowe przykłady w witrynie GitHub |
W tym przewodniku z instrukcjami dowiesz się, jak używać usługi Azure AI Speech do konwersji tekstu w czasie rzeczywistym. Rozpoznawanie mowy w czasie rzeczywistym jest idealne dla aplikacji wymagających natychmiastowej transkrypcji, takich jak dyktowanie, pomoc w centrum obsługi telefonicznej i transkrypcja na żywo.
Aby dowiedzieć się, jak skonfigurować środowisko dla przykładowej aplikacji, zobacz Szybki start: rozpoznawanie i konwertowanie mowy na tekst.
Tworzenie wystąpienia konfiguracji mowy
Aby wywołać usługę Rozpoznawanie mowy przy użyciu zestawu SPEECH SDK, należy utworzyć SpeechConfig
wystąpienie. Ta klasa zawiera informacje o subskrypcji, takie jak klucz i skojarzony region, punkt końcowy, host lub token autoryzacji.
- Utwórz zasób usługi Mowa w witrynie Azure Portal. Pobierz klucz zasobu usługi Mowa i region.
SpeechConfig
Utwórz wystąpienie przy użyciu następującego kodu. ZastąpYourSpeechKey
wartości iYourSpeechRegion
kluczem zasobu usługi Mowa i regionem.
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
class Program
{
async static Task Main(string[] args)
{
var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
}
}
Można zainicjować SpeechConfig
na kilka innych sposobów:
- Użyj punktu końcowego i przekaż punkt końcowy usługi Rozpoznawanie mowy. Klucz lub token autoryzacji jest opcjonalny.
- Użyj hosta i przekaż adres hosta. Klucz lub token autoryzacji jest opcjonalny.
- Użyj tokenu autoryzacji ze skojarzonym regionem/lokalizacją.
Uwaga
Niezależnie od tego, czy wykonujesz rozpoznawanie mowy, syntezę mowy, tłumaczenie, czy rozpoznawanie intencji, zawsze tworzysz konfigurację.
Rozpoznawanie mowy przy użyciu mikrofonu
Aby rozpoznawać mowę AudioConfig
przy użyciu mikrofonu urządzenia, utwórz wystąpienie przy użyciu FromDefaultMicrophoneInput()
metody . Następnie zainicjuj SpeechRecognizer
obiekt, przekazując speechConfig
polecenie i audioConfig
.
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
class Program
{
async static Task FromMic(SpeechConfig speechConfig)
{
using var audioConfig = AudioConfig.FromDefaultMicrophoneInput();
using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
Console.WriteLine("Speak into your microphone.");
var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
}
async static Task Main(string[] args)
{
var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
await FromMic(speechConfig);
}
}
Jeśli chcesz użyć określonego urządzenia wejściowego audio, musisz określić identyfikator urządzenia w pliku AudioConfig
. Aby dowiedzieć się, jak uzyskać identyfikator urządzenia, zobacz Select an audio input device with the Speech SDK (Wybieranie urządzenia wejściowego audio przy użyciu zestawu SDK usługi Mowa).
Rozpoznawanie mowy z pliku
Jeśli chcesz rozpoznać mowę AudioConfig
z pliku audio zamiast mikrofonu, nadal musisz utworzyć wystąpienie. Jednak nie wywołujesz metody FromDefaultMicrophoneInput()
. FromWavFileInput()
Wywołasz metodę i przekażesz ścieżkę pliku:
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
class Program
{
async static Task FromFile(SpeechConfig speechConfig)
{
using var audioConfig = AudioConfig.FromWavFileInput("PathToFile.wav");
using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
}
async static Task Main(string[] args)
{
var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
await FromFile(speechConfig);
}
}
Rozpoznawanie mowy ze strumienia w pamięci
W wielu przypadkach użycia prawdopodobnie dane audio pochodzą z usługi Azure Blob Storage lub są już w pamięci jako byte[]
wystąpienie lub podobna struktura danych pierwotnych. W poniższym przykładzie użyto PushAudioInputStream
metody rozpoznawania mowy, która jest zasadniczo abstrakcyjnym strumieniem pamięci. Przykładowy kod wykonuje następujące akcje:
- Zapisuje nieprzetworzone dane
PushAudioInputStream
audio przy użyciuWrite()
funkcji, która akceptujebyte[]
wystąpienie. - Odczytuje plik .wav przy użyciu
FileReader
do celów demonstracyjnych. Jeśli masz już dane audio w wystąpieniubyte[]
, możesz przejść bezpośrednio do zapisywania zawartości do strumienia wejściowego. - Domyślny format to 16-bitowe, 16-kHz mono modulacji kodu impulsu (PCM). Aby dostosować format, możesz przekazać
AudioStreamFormat
obiekt doCreatePushStream()
przy użyciu funkcjiAudioStreamFormat.GetWaveFormatPCM(sampleRate, (byte)bitRate, (byte)channels)
statycznej .
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
class Program
{
async static Task FromStream(SpeechConfig speechConfig)
{
var reader = new BinaryReader(File.OpenRead("PathToFile.wav"));
using var audioConfigStream = AudioInputStream.CreatePushStream();
using var audioConfig = AudioConfig.FromStreamInput(audioConfigStream);
using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
byte[] readBytes;
do
{
readBytes = reader.ReadBytes(1024);
audioConfigStream.Write(readBytes, readBytes.Length);
} while (readBytes.Length > 0);
var speechRecognitionResult = await speechRecognizer.RecognizeOnceAsync();
Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
}
async static Task Main(string[] args)
{
var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
await FromStream(speechConfig);
}
}
Użycie strumienia wypychania jako danych wejściowych zakłada, że dane audio są nieprzetworzone PCM i pomija wszystkie nagłówki. Interfejs API nadal działa w niektórych przypadkach, jeśli nagłówek nie zostanie pominięty. Aby uzyskać najlepsze wyniki, rozważ zaimplementowanie logiki w celu odczytania nagłówków tak, aby byte[]
zaczynały się od początku danych dźwiękowych.
Obsługa błędów
Poprzednie przykłady pobierają tylko rozpoznany tekst z speechRecognitionResult.Text
właściwości . Aby obsłużyć błędy i inne odpowiedzi, musisz napisać kod, aby obsłużyć wynik. Poniższy kod ocenia speechRecognitionResult.Reason
właściwość i:
- Wyświetla wynik rozpoznawania:
ResultReason.RecognizedSpeech
. - Jeśli nie ma dopasowania do rozpoznawania, informuje użytkownika:
ResultReason.NoMatch
. - Jeśli wystąpi błąd, zostanie wyświetlony komunikat o błędzie:
ResultReason.Canceled
.
switch (speechRecognitionResult.Reason)
{
case ResultReason.RecognizedSpeech:
Console.WriteLine($"RECOGNIZED: Text={speechRecognitionResult.Text}");
break;
case ResultReason.NoMatch:
Console.WriteLine($"NOMATCH: Speech could not be recognized.");
break;
case ResultReason.Canceled:
var cancellation = CancellationDetails.FromResult(speechRecognitionResult);
Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");
if (cancellation.Reason == CancellationReason.Error)
{
Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
Console.WriteLine($"CANCELED: ErrorDetails={cancellation.ErrorDetails}");
Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
}
break;
}
Korzystanie z funkcji ciągłego rozpoznawania
W poprzednich przykładach użyto funkcji rozpoznawania pojedynczego strzału, która rozpoznaje jedną wypowiedź. Koniec pojedynczej wypowiedzi jest określany przez nasłuchiwanie ciszy na końcu lub do momentu przetworzenia maksymalnie 15 sekund dźwięku.
Natomiast używasz funkcji rozpoznawania ciągłego, gdy chcesz kontrolować, kiedy zatrzymać rozpoznawanie. Wymaga ona zasubskrybowania zdarzeń Recognizing
, Recognized
i Canceled
w celu uzyskania wyników rozpoznawania. Aby zatrzymać rozpoznawanie, należy wywołać metodę StopContinuousRecognitionAsync
. Oto przykład sposobu wykonywania ciągłego rozpoznawania w pliku wejściowym audio.
Zacznij od zdefiniowania danych wejściowych i inicjowania SpeechRecognizer
:
using var audioConfig = AudioConfig.FromWavFileInput("YourAudioFile.wav");
using var speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
Następnie utwórz TaskCompletionSource<int>
wystąpienie do zarządzania stanem rozpoznawania mowy:
var stopRecognition = new TaskCompletionSource<int>();
Następnie zasubskrybuj zdarzenia, które SpeechRecognizer
wysyła:
Recognizing
: Sygnał dla zdarzeń zawierających wyniki rozpoznawania pośredniego.Recognized
: sygnał dla zdarzeń zawierających końcowe wyniki rozpoznawania, które wskazują pomyślną próbę rozpoznawania.SessionStopped
: Sygnał dla zdarzeń, które wskazują koniec sesji rozpoznawania (operacja).Canceled
: Sygnał dla zdarzeń zawierających anulowane wyniki rozpoznawania. Te wyniki wskazują próbę rozpoznawania, która została anulowana w wyniku żądania bezpośredniego anulowania. Alternatywnie wskazują one awarię transportu lub protokołu.
speechRecognizer.Recognizing += (s, e) =>
{
Console.WriteLine($"RECOGNIZING: Text={e.Result.Text}");
};
speechRecognizer.Recognized += (s, e) =>
{
if (e.Result.Reason == ResultReason.RecognizedSpeech)
{
Console.WriteLine($"RECOGNIZED: Text={e.Result.Text}");
}
else if (e.Result.Reason == ResultReason.NoMatch)
{
Console.WriteLine($"NOMATCH: Speech could not be recognized.");
}
};
speechRecognizer.Canceled += (s, e) =>
{
Console.WriteLine($"CANCELED: Reason={e.Reason}");
if (e.Reason == CancellationReason.Error)
{
Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}");
Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
}
stopRecognition.TrySetResult(0);
};
speechRecognizer.SessionStopped += (s, e) =>
{
Console.WriteLine("\n Session stopped event.");
stopRecognition.TrySetResult(0);
};
Po skonfigurowaniu wszystkiego wywołaj metodę StartContinuousRecognitionAsync
, aby rozpocząć rozpoznawanie:
await speechRecognizer.StartContinuousRecognitionAsync();
// Waits for completion. Use Task.WaitAny to keep the task rooted.
Task.WaitAny(new[] { stopRecognition.Task });
// Make the following call at some point to stop recognition:
// await speechRecognizer.StopContinuousRecognitionAsync();
Zmienianie języka źródłowego
Typowym zadaniem rozpoznawania mowy jest określenie języka wejściowego (lub źródłowego). W poniższym przykładzie pokazano, jak zmienić język wejściowy na włoski. W kodzie znajdź SpeechConfig
wystąpienie i dodaj ten wiersz bezpośrednio pod nim:
speechConfig.SpeechRecognitionLanguage = "it-IT";
Właściwość SpeechRecognitionLanguage
oczekuje ciągu formatu ustawień regionalnych języka. Aby uzyskać listę obsługiwanych ustawień regionalnych, zobacz Obsługa języka i głosu dla usługi Mowa.
Identyfikacja języka
Można użyć identyfikacji języka z rozpoznawaniem mowy do rozpoznawania tekstu, gdy trzeba zidentyfikować język w źródle audio, a następnie transkrybować go do tekstu.
Aby zapoznać się z kompletnym przykładem kodu, zobacz Identyfikacja języka.
Używanie niestandardowego punktu końcowego
Za pomocą mowy niestandardowej możesz przekazać własne dane, przetestować i wytrenować model niestandardowy, porównać dokładność między modelami i wdrożyć model w niestandardowym punkcie końcowym. W poniższym przykładzie pokazano, jak ustawić niestandardowy punkt końcowy.
var speechConfig = SpeechConfig.FromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig.EndpointId = "YourEndpointId";
var speechRecognizer = new SpeechRecognizer(speechConfig);
Uruchamianie i używanie kontenera
Kontenery mowy udostępniają internetowe interfejsy API punktów końcowych zapytań oparte na protokole Websocket, które są dostępne za pośrednictwem zestawu SPEECH SDK i interfejsu wiersza polecenia usługi Mowa. Domyślnie zestaw SDK usługi Mowa i interfejs wiersza polecenia usługi Mowa używają publicznej usługi rozpoznawania mowy. Aby użyć kontenera, należy zmienić metodę inicjowania. Użyj adresu URL hosta kontenera zamiast klucza i regionu.
Aby uzyskać więcej informacji na temat kontenerów, zobacz Host URL in Install and run Speech containers with Docker (Adresy URL hostów w temacie Instalowanie i uruchamianie kontenerów usługi Mowa za pomocą platformy Docker).
Zmienianie sposobu obsługi ciszy
Jeśli użytkownik mówi szybciej lub wolniej niż zwykle, domyślne zachowania dla ciszy niespeech w dźwięku wejściowego mogą nie spowodować oczekiwanego zachowania. Typowe problemy z obsługą ciszy obejmują:
- Szybka mowa, która łączy wiele zdań w jeden wynik rozpoznawania, zamiast rozbijać zdania na poszczególne wyniki.
- Powolna mowa, która oddziela części pojedynczego zdania na wiele wyników.
- Rozpoznawanie pojedynczego strzału, które kończy się zbyt szybko, czekając na rozpoczęcie mowy.
Te problemy można rozwiązać, ustawiając jedną z dwóch właściwości limitu czasu w wystąpieniu SpeechConfig
użytym do utworzenia elementu SpeechRecognizer
:
- Limit czasu wyciszenia segmentacji dostosowuje, ile dźwięku niespeech jest dozwolony w frazie, która jest obecnie mówiona, zanim ta fraza zostanie uznana za "gotowe".
- Wyższe wartości zwykle wydłużają wyniki i umożliwiają dłuższe wstrzymanie od osoby mówiącej w ramach frazy, ale wyniki mogą trwać dłużej. Mogą również łączyć oddzielne frazy w jeden wynik po ustawieniu zbyt dużej wartości.
- Niższe wartości zwykle sprawiają, że wyniki są krótsze i zapewniają większą liczbę monitów i częstszych podziałów między frazami, ale mogą również powodować oddzielenie pojedynczych fraz na wiele wyników po ustawieniu zbyt małej wartości.
- Ten limit czasu można ustawić na wartości całkowite z zakresu od 100 do 5000 w milisekundach z wartością 500 typową wartością domyślną.
- Początkowy limit czasu ciszy dostosowuje, ile dźwięku niespeech jest dozwolony przed wyrażeniem przed zakończeniem próby rozpoznawania w wyniku "brak dopasowania".
- Wyższe wartości zapewniają głośnikom więcej czasu na reagowanie i rozpoczynanie mówienia, ale może również spowodować spowolnienie reakcji, gdy nic nie jest mówione.
- Niższe wartości zapewniają monit "brak dopasowania" w celu szybszego środowiska użytkownika i bardziej kontrolowanej obsługi dźwięku, ale może odciąć głośnik zbyt szybko po ustawieniu zbyt małej ilości.
- Ponieważ funkcja ciągłego rozpoznawania generuje wiele wyników, ta wartość określa, jak często docierają wyniki "brak dopasowania", ale w przeciwnym razie nie wpływają na zawartość wyników rozpoznawania.
- Ten limit czasu można ustawić na dowolną nieujemną wartość całkowitą, w milisekundach lub na wartość 0, aby całkowicie ją wyłączyć. 5000 jest typowym ustawieniem domyślnym dla rozpoznawania pojedynczego strzału, podczas gdy 15000 jest typowym ustawieniem domyślnym dla ciągłego rozpoznawania.
Ponieważ podczas modyfikowania tych limitów czasu występują kompromisy, należy zmienić ustawienia tylko wtedy, gdy masz problem związany z obsługą ciszy. Wartości domyślne optymalnie obsługują większość dźwięku mówionego i powinny napotykać problemy tylko w rzadkich scenariuszach.
Przykład: Użytkownicy mówiący numer seryjny, taki jak "ABC-123-4567", mogą wstrzymać się między grupami znaków wystarczająco długo, aby numer seryjny został podzielony na wiele wyników. W takim przypadku spróbuj użyć wyższej wartości, takiej jak 2000 milisekund dla limitu czasu ciszy segmentacji:
speechConfig.SetProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, "2000");
Przykład: Nagrana mowa prezentera może być wystarczająco szybka, że kilka zdań w wierszu zostanie połączonych, a duże wyniki rozpoznawania docierają tylko raz lub dwa razy na minutę. W tym przypadku ustaw limit czasu ciszy segmentacji na niższą wartość, taką jak 300 ms:
speechConfig.SetProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, "300");
Przykład: rozpoznawanie pojedynczego strzału z prośbą osoby mówiącej o znalezienie i odczytanie numeru seryjnego kończy się zbyt szybko podczas znajdowania numeru. W takim przypadku spróbuj dłuższy początkowy limit czasu ciszy, taki jak 10 000 ms:
speechConfig.SetProperty(PropertyId.SpeechServiceConnection_InitialSilenceTimeoutMs, "10000");
Segmentacja semantyczna
Segmentacja semantyczna to strategia segmentacji rozpoznawania mowy zaprojektowana w celu ograniczenia problemów związanych z segmentacją opartą na ciszy:
- Under-segmentation: Gdy użytkownicy mówią przez długi czas bez przerw, mogą zobaczyć długą sekwencję tekstu bez podziałów ("ściana tekstu"), co poważnie obniża ich czytelność.
- Nadmierna segmentacja: gdy użytkownik wstrzymuje się przez krótki czas, mechanizm wykrywania ciszy może niepoprawnie podzielić segmenty.
Zamiast polegać na przekroczeniu limitów czasu ciszy, segmentacja semantyczna i zwraca końcowe wyniki, gdy wykrywa znaki interpunkcyjne kończące zdanie (np. ""." lub "?"). Poprawia to środowisko użytkownika dzięki wyższej jakości, semantycznie kompletnym segmentom i zapobiega długim wynikom pośrednim.
Aby użyć segmentacji semantycznej, należy ustawić następującą właściwość w wystąpieniu SpeechConfig
użytym do utworzenia elementu SpeechRecognizer
:
speechConfig.SetProperty(PropertyId.Speech_SegmentationStrategy, "Semantic");
Niektóre ograniczenia segmentacji semantycznej są następujące:
- Do korzystania z segmentacji semantycznej potrzebny jest zestaw Speech SDK w wersji 1.41 lub nowszej.
- Segmentacja semantyczna jest przeznaczona tylko do użytku w funkcji ciągłego rozpoznawania. Obejmuje to scenariusze, takie jak transkrypcja i transkrypcja. Nie należy jej używać w trybie rozpoznawania pojedynczego i dyktowania.
- Segmentacja semantyczna nie jest dostępna dla wszystkich języków i ustawień regionalnych. Obecnie segmentacja semantyczna jest dostępna tylko dla ustawień regionalnych języka angielskiego (en), takich jak en-US, en-GB, en-IN i en-AU.
- Segmentacja semantyczna nie obsługuje jeszcze wyników ufności i list NBest. W związku z tym nie zalecamy segmentacji semantycznej, jeśli używasz współczynników ufności ani list NBest.
Dokumentacja referencyjna Package (NuGet) | Dodatkowe przykłady w witrynie GitHub |
W tym przewodniku z instrukcjami dowiesz się, jak używać usługi Azure AI Speech do konwersji tekstu w czasie rzeczywistym. Rozpoznawanie mowy w czasie rzeczywistym jest idealne dla aplikacji wymagających natychmiastowej transkrypcji, takich jak dyktowanie, pomoc w centrum obsługi telefonicznej i transkrypcja na żywo.
Aby dowiedzieć się, jak skonfigurować środowisko dla przykładowej aplikacji, zobacz Szybki start: rozpoznawanie i konwertowanie mowy na tekst.
Tworzenie wystąpienia konfiguracji mowy
Aby wywołać usługę rozpoznawania mowy przy użyciu zestawu SPEECH SDK, należy utworzyć SpeechConfig
wystąpienie. Ta klasa zawiera informacje o subskrypcji, takie jak klucz i skojarzony region, punkt końcowy, host lub token autoryzacji.
- Utwórz zasób usługi Mowa w witrynie Azure Portal. Pobierz klucz zasobu usługi Mowa i region.
SpeechConfig
Utwórz wystąpienie przy użyciu następującego kodu. ZastąpYourSpeechKey
wartości iYourSpeechRegion
kluczem zasobu usługi Mowa i regionem.
using namespace std;
using namespace Microsoft::CognitiveServices::Speech;
auto speechConfig = SpeechConfig::FromSubscription("YourSpeechKey", "YourSpeechRegion");
Można zainicjować SpeechConfig
na kilka innych sposobów:
- Użyj punktu końcowego i przekaż punkt końcowy usługi Rozpoznawanie mowy. Klucz lub token autoryzacji jest opcjonalny.
- Użyj hosta i przekaż adres hosta. Klucz lub token autoryzacji jest opcjonalny.
- Użyj tokenu autoryzacji ze skojarzonym regionem/lokalizacją.
Uwaga
Niezależnie od tego, czy wykonujesz rozpoznawanie mowy, syntezę mowy, tłumaczenie, czy rozpoznawanie intencji, zawsze tworzysz konfigurację.
Rozpoznawanie mowy przy użyciu mikrofonu
Aby rozpoznawać mowę AudioConfig
przy użyciu mikrofonu urządzenia, utwórz wystąpienie przy użyciu funkcji składowej FromDefaultMicrophoneInput()
. Następnie zainicjujSpeechRecognizer
obiekt, przekazując audioConfig
polecenie i config
.
using namespace Microsoft::CognitiveServices::Speech::Audio;
auto audioConfig = AudioConfig::FromDefaultMicrophoneInput();
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);
cout << "Speak into your microphone." << std::endl;
auto result = speechRecognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;
Jeśli chcesz użyć określonego urządzenia wejściowego audio, musisz określić identyfikator urządzenia w pliku AudioConfig
. Aby dowiedzieć się, jak uzyskać identyfikator urządzenia, zobacz Select an audio input device with the Speech SDK (Wybieranie urządzenia wejściowego audio przy użyciu zestawu SDK usługi Mowa).
Rozpoznawanie mowy z pliku
Jeśli chcesz rozpoznawać mowę z pliku audio zamiast używać mikrofonu, nadal musisz utworzyć AudioConfig
wystąpienie. Jednak nie wywołujesz metody FromDefaultMicrophoneInput()
. FromWavFileInput()
Wywołasz metodę i przekażesz ścieżkę pliku:
using namespace Microsoft::CognitiveServices::Speech::Audio;
auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);
auto result = speechRecognizer->RecognizeOnceAsync().get();
cout << "RECOGNIZED: Text=" << result->Text << std::endl;
Rozpoznawanie mowy przy użyciu klasy Recognizer
Klasa Recognizer dla zestawu SPEECH SDK dla języka C++ uwidacznia kilka metod, których można użyć do rozpoznawania mowy.
Rozpoznawanie pojedynczego strzału
Funkcja rozpoznawania pojedynczego strzału asynchronicznie rozpoznaje jedną wypowiedź. Koniec pojedynczej wypowiedzi jest określany przez nasłuchiwanie ciszy na końcu lub do momentu przetworzenia maksymalnie 15 sekund dźwięku. Oto przykład asynchronicznego rozpoznawania pojedynczego strzału za pomocą metody RecognizeOnceAsync
:
auto result = speechRecognizer->RecognizeOnceAsync().get();
Aby obsłużyć wynik, musisz napisać kod. Ta przykładowa result->Reason
ocena i:
- Wyświetla wynik rozpoznawania:
ResultReason::RecognizedSpeech
. - Jeśli nie ma dopasowania do rozpoznawania, informuje użytkownika:
ResultReason::NoMatch
. - Jeśli wystąpi błąd, zostanie wyświetlony komunikat o błędzie:
ResultReason::Canceled
.
switch (result->Reason)
{
case ResultReason::RecognizedSpeech:
cout << "We recognized: " << result->Text << std::endl;
break;
case ResultReason::NoMatch:
cout << "NOMATCH: Speech could not be recognized." << std::endl;
break;
case ResultReason::Canceled:
{
auto cancellation = CancellationDetails::FromResult(result);
cout << "CANCELED: Reason=" << (int)cancellation->Reason << std::endl;
if (cancellation->Reason == CancellationReason::Error) {
cout << "CANCELED: ErrorCode= " << (int)cancellation->ErrorCode << std::endl;
cout << "CANCELED: ErrorDetails=" << cancellation->ErrorDetails << std::endl;
cout << "CANCELED: Did you set the speech resource key and region values?" << std::endl;
}
}
break;
default:
break;
}
Ciągłe rozpoznawanie
Ciągłe rozpoznawanie jest nieco bardziej zaangażowane niż rozpoznawanie pojedynczych zdjęć. Wymaga ona zasubskrybowania zdarzeń Recognizing
, Recognized
i Canceled
w celu uzyskania wyników rozpoznawania. Aby zatrzymać rozpoznawanie, należy wywołać metodę StopContinuousRecognitionAsync. Oto przykład ciągłego rozpoznawania wykonywanego w pliku wejściowym audio.
Zacznij od zdefiniowania danych wejściowych i inicjowania SpeechRecognizer
:
auto audioConfig = AudioConfig::FromWavFileInput("YourAudioFile.wav");
auto speechRecognizer = SpeechRecognizer::FromConfig(config, audioConfig);
Następnie utwórz zmienną do zarządzania stanem rozpoznawania mowy. Zadeklaruj promise<void>
, ponieważ na początku rozpoznawania można bezpiecznie założyć, że nie zostało zakończone:
promise<void> recognitionEnd;
Następnie zasubskrybuj zdarzenia, które SpeechRecognizer
wysyła:
Recognizing
: Sygnał dla zdarzeń zawierających wyniki rozpoznawania pośredniego.Recognized
: sygnał dla zdarzeń zawierających końcowe wyniki rozpoznawania, które wskazują pomyślną próbę rozpoznawania.SessionStopped
: Sygnał dla zdarzeń, które wskazują koniec sesji rozpoznawania (operacja).Canceled
: Sygnał dla zdarzeń zawierających anulowane wyniki rozpoznawania. Te wyniki wskazują próbę rozpoznawania, która została anulowana w wyniku żądania anulowania bezpośredniego. Alternatywnie wskazują one awarię transportu lub protokołu.
speechRecognizer->Recognizing.Connect([](const SpeechRecognitionEventArgs& e)
{
cout << "Recognizing:" << e.Result->Text << std::endl;
});
speechRecognizer->Recognized.Connect([](const SpeechRecognitionEventArgs& e)
{
if (e.Result->Reason == ResultReason::RecognizedSpeech)
{
cout << "RECOGNIZED: Text=" << e.Result->Text
<< " (text could not be translated)" << std::endl;
}
else if (e.Result->Reason == ResultReason::NoMatch)
{
cout << "NOMATCH: Speech could not be recognized." << std::endl;
}
});
speechRecognizer->Canceled.Connect([&recognitionEnd](const SpeechRecognitionCanceledEventArgs& e)
{
cout << "CANCELED: Reason=" << (int)e.Reason << std::endl;
if (e.Reason == CancellationReason::Error)
{
cout << "CANCELED: ErrorCode=" << (int)e.ErrorCode << "\n"
<< "CANCELED: ErrorDetails=" << e.ErrorDetails << "\n"
<< "CANCELED: Did you set the speech resource key and region values?" << std::endl;
recognitionEnd.set_value(); // Notify to stop recognition.
}
});
speechRecognizer->SessionStopped.Connect([&recognitionEnd](const SessionEventArgs& e)
{
cout << "Session stopped.";
recognitionEnd.set_value(); // Notify to stop recognition.
});
Po skonfigurowaniu wszystkiego wywołaj metodę StartContinuousRecognitionAsync
, aby rozpocząć rozpoznawanie:
// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
speechRecognizer->StartContinuousRecognitionAsync().get();
// Waits for recognition end.
recognitionEnd.get_future().get();
// Stops recognition.
speechRecognizer->StopContinuousRecognitionAsync().get();
Zmienianie języka źródłowego
Typowym zadaniem rozpoznawania mowy jest określenie języka wejściowego (lub źródłowego). W poniższym przykładzie pokazano, jak zmienić język wejściowy na niemiecki. W kodzie znajdź SpeechConfig
wystąpienie i dodaj ten wiersz bezpośrednio pod nim:
speechConfig->SetSpeechRecognitionLanguage("de-DE");
SetSpeechRecognitionLanguage
jest parametrem, który przyjmuje ciąg jako argument. Aby uzyskać listę obsługiwanych ustawień regionalnych, zobacz Obsługa języka i głosu dla usługi Mowa.
Identyfikacja języka
Można użyć identyfikacji języka z rozpoznawaniem mowy do rozpoznawania tekstu, gdy trzeba zidentyfikować język w źródle audio, a następnie transkrybować go do tekstu.
Aby zapoznać się z kompletnym przykładem kodu, zobacz Identyfikacja języka.
Używanie niestandardowego punktu końcowego
Za pomocą mowy niestandardowej możesz przekazać własne dane, przetestować i wytrenować model niestandardowy, porównać dokładność między modelami i wdrożyć model w niestandardowym punkcie końcowym. W poniższym przykładzie pokazano, jak ustawić niestandardowy punkt końcowy.
auto speechConfig = SpeechConfig::FromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig->SetEndpointId("YourEndpointId");
auto speechRecognizer = SpeechRecognizer::FromConfig(speechConfig);
Uruchamianie i używanie kontenera
Kontenery mowy udostępniają internetowe interfejsy API punktów końcowych zapytań oparte na protokole Websocket, które są dostępne za pośrednictwem zestawu SPEECH SDK i interfejsu wiersza polecenia usługi Mowa. Domyślnie zestaw SDK usługi Mowa i interfejs wiersza polecenia usługi Mowa używają publicznej usługi rozpoznawania mowy. Aby użyć kontenera, należy zmienić metodę inicjowania. Użyj adresu URL hosta kontenera zamiast klucza i regionu.
Aby uzyskać więcej informacji na temat kontenerów, zobacz Host URL in Install and run Speech containers with Docker (Adresy URL hostów w temacie Instalowanie i uruchamianie kontenerów usługi Mowa za pomocą platformy Docker).
Segmentacja semantyczna
Segmentacja semantyczna to strategia segmentacji rozpoznawania mowy zaprojektowana w celu ograniczenia problemów związanych z segmentacją opartą na ciszy:
- Under-segmentation: Gdy użytkownicy mówią przez długi czas bez przerw, mogą zobaczyć długą sekwencję tekstu bez podziałów ("ściana tekstu"), co poważnie obniża ich czytelność.
- Nadmierna segmentacja: gdy użytkownik wstrzymuje się przez krótki czas, mechanizm wykrywania ciszy może niepoprawnie podzielić segmenty.
Zamiast polegać na przekroczeniu limitów czasu ciszy, segmentacja semantyczna i zwraca końcowe wyniki, gdy wykrywa znaki interpunkcyjne kończące zdanie (np. ""." lub "?"). Poprawia to środowisko użytkownika dzięki wyższej jakości, semantycznie kompletnym segmentom i zapobiega długim wynikom pośrednim.
Aby użyć segmentacji semantycznej, należy ustawić następującą właściwość w wystąpieniu SpeechConfig
użytym do utworzenia elementu SpeechRecognizer
:
speechConfig->SetProperty(PropertyId::Speech_SegmentationStrategy, "Semantic");
Niektóre ograniczenia segmentacji semantycznej są następujące:
- Do korzystania z segmentacji semantycznej potrzebny jest zestaw Speech SDK w wersji 1.41 lub nowszej.
- Segmentacja semantyczna jest przeznaczona tylko do użytku w funkcji ciągłego rozpoznawania. Obejmuje to scenariusze, takie jak transkrypcja i transkrypcja. Nie należy jej używać w trybie rozpoznawania pojedynczego i dyktowania.
- Segmentacja semantyczna nie jest dostępna dla wszystkich języków i ustawień regionalnych. Obecnie segmentacja semantyczna jest dostępna tylko dla ustawień regionalnych języka angielskiego (en), takich jak en-US, en-GB, en-IN i en-AU.
- Segmentacja semantyczna nie obsługuje jeszcze wyników ufności i list NBest. W związku z tym nie zalecamy segmentacji semantycznej, jeśli używasz współczynników ufności ani list NBest.
Dokumentacja referencyjna Package (Go) | Dodatkowe przykłady w witrynie GitHub |
W tym przewodniku z instrukcjami dowiesz się, jak używać usługi Azure AI Speech do konwersji tekstu w czasie rzeczywistym. Rozpoznawanie mowy w czasie rzeczywistym jest idealne dla aplikacji wymagających natychmiastowej transkrypcji, takich jak dyktowanie, pomoc w centrum obsługi telefonicznej i transkrypcja na żywo.
Aby dowiedzieć się, jak skonfigurować środowisko dla przykładowej aplikacji, zobacz Szybki start: rozpoznawanie i konwertowanie mowy na tekst.
Rozpoznawanie mowy na tekst z mikrofonu
- Utwórz zasób usługi Mowa w witrynie Azure Portal. Pobierz klucz zasobu usługi Mowa i region.
- Użyj poniższego przykładu kodu, aby uruchomić rozpoznawanie mowy z domyślnego mikrofonu urządzenia. Zastąp
YourSpeechKey
wartości iYourSpeechRegion
kluczem zasobu usługi Mowa i regionem. Uruchomienie skryptu powoduje uruchomienie sesji rozpoznawania w domyślnym mikrofonie i tekście wyjściowym:
package main
import (
"bufio"
"fmt"
"os"
"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)
func sessionStartedHandler(event speech.SessionEventArgs) {
defer event.Close()
fmt.Println("Session Started (ID=", event.SessionID, ")")
}
func sessionStoppedHandler(event speech.SessionEventArgs) {
defer event.Close()
fmt.Println("Session Stopped (ID=", event.SessionID, ")")
}
func recognizingHandler(event speech.SpeechRecognitionEventArgs) {
defer event.Close()
fmt.Println("Recognizing:", event.Result.Text)
}
func recognizedHandler(event speech.SpeechRecognitionEventArgs) {
defer event.Close()
fmt.Println("Recognized:", event.Result.Text)
}
func cancelledHandler(event speech.SpeechRecognitionCanceledEventArgs) {
defer event.Close()
fmt.Println("Received a cancellation: ", event.ErrorDetails)
fmt.Println("Did you set the speech resource key and region values?")
}
func main() {
subscription := "YourSpeechKey"
region := "YourSpeechRegion"
audioConfig, err := audio.NewAudioConfigFromDefaultMicrophoneInput()
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer audioConfig.Close()
config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer config.Close()
speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer speechRecognizer.Close()
speechRecognizer.SessionStarted(sessionStartedHandler)
speechRecognizer.SessionStopped(sessionStoppedHandler)
speechRecognizer.Recognizing(recognizingHandler)
speechRecognizer.Recognized(recognizedHandler)
speechRecognizer.Canceled(cancelledHandler)
speechRecognizer.StartContinuousRecognitionAsync()
defer speechRecognizer.StopContinuousRecognitionAsync()
bufio.NewReader(os.Stdin).ReadBytes('\n')
}
Uruchom następujące polecenia, aby utworzyć plik go.mod , który łączy się ze składnikami hostowanymi w usłudze GitHub:
go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go
Teraz skompiluj i uruchom kod:
go build
go run quickstart
Aby uzyskać szczegółowe informacje, zobacz zawartość referencyjną SpeechConfig
dla klasy i SpeechRecognizer
klasy.
Rozpoznawanie mowy na tekst z pliku audio
Użyj poniższego przykładu, aby uruchomić rozpoznawanie mowy z pliku audio. Zastąp YourSpeechKey
wartości i YourSpeechRegion
kluczem zasobu usługi Mowa i regionem. Ponadto zastąp zmienną file
ścieżką do pliku .wav . Po uruchomieniu skryptu rozpoznaje mowę z pliku i generuje wynik tekstowy:
package main
import (
"fmt"
"time"
"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
)
func main() {
subscription := "YourSpeechKey"
region := "YourSpeechRegion"
file := "path/to/file.wav"
audioConfig, err := audio.NewAudioConfigFromWavFileInput(file)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer audioConfig.Close()
config, err := speech.NewSpeechConfigFromSubscription(subscription, region)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer config.Close()
speechRecognizer, err := speech.NewSpeechRecognizerFromConfig(config, audioConfig)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer speechRecognizer.Close()
speechRecognizer.SessionStarted(func(event speech.SessionEventArgs) {
defer event.Close()
fmt.Println("Session Started (ID=", event.SessionID, ")")
})
speechRecognizer.SessionStopped(func(event speech.SessionEventArgs) {
defer event.Close()
fmt.Println("Session Stopped (ID=", event.SessionID, ")")
})
task := speechRecognizer.RecognizeOnceAsync()
var outcome speech.SpeechRecognitionOutcome
select {
case outcome = <-task:
case <-time.After(5 * time.Second):
fmt.Println("Timed out")
return
}
defer outcome.Close()
if outcome.Error != nil {
fmt.Println("Got an error: ", outcome.Error)
}
fmt.Println("Got a recognition!")
fmt.Println(outcome.Result.Text)
}
Uruchom następujące polecenia, aby utworzyć plik go.mod , który łączy się ze składnikami hostowanymi w usłudze GitHub:
go mod init quickstart
go get github.com/Microsoft/cognitive-services-speech-sdk-go
Teraz skompiluj i uruchom kod:
go build
go run quickstart
Aby uzyskać szczegółowe informacje, zobacz zawartość referencyjną SpeechConfig
dla klasy i SpeechRecognizer
klasy.
Uruchamianie i używanie kontenera
Kontenery mowy udostępniają internetowe interfejsy API punktów końcowych zapytań oparte na protokole Websocket, które są dostępne za pośrednictwem zestawu SPEECH SDK i interfejsu wiersza polecenia usługi Mowa. Domyślnie zestaw SDK usługi Mowa i interfejs wiersza polecenia usługi Mowa używają publicznej usługi rozpoznawania mowy. Aby użyć kontenera, należy zmienić metodę inicjowania. Użyj adresu URL hosta kontenera zamiast klucza i regionu.
Aby uzyskać więcej informacji na temat kontenerów, zobacz Host URL in Install and run Speech containers with Docker (Adresy URL hostów w temacie Instalowanie i uruchamianie kontenerów usługi Mowa za pomocą platformy Docker).
| Dokumentacja referencyjna Dodatkowe przykłady w usłudze GitHub
W tym przewodniku z instrukcjami dowiesz się, jak używać usługi Azure AI Speech do konwersji tekstu w czasie rzeczywistym. Rozpoznawanie mowy w czasie rzeczywistym jest idealne dla aplikacji wymagających natychmiastowej transkrypcji, takich jak dyktowanie, pomoc w centrum obsługi telefonicznej i transkrypcja na żywo.
Aby dowiedzieć się, jak skonfigurować środowisko dla przykładowej aplikacji, zobacz Szybki start: rozpoznawanie i konwertowanie mowy na tekst.
Tworzenie wystąpienia konfiguracji mowy
Aby wywołać usługę Rozpoznawanie mowy przy użyciu zestawu SPEECH SDK, musisz utworzyć wystąpienie usługi SpeechConfig . Ta klasa zawiera informacje o subskrypcji, takie jak klucz i skojarzony region, punkt końcowy, host lub token autoryzacji.
- Utwórz zasób usługi Mowa w witrynie Azure Portal. Pobierz klucz zasobu usługi Mowa i region.
SpeechConfig
Utwórz wystąpienie przy użyciu klucza i regionu usługi Mowa.
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public class Program {
public static void main(String[] args) throws InterruptedException, ExecutionException {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key>", "<paste-your-region>");
}
}
Można zainicjować SpeechConfig
na kilka innych sposobów:
- Użyj punktu końcowego i przekaż punkt końcowy usługi Rozpoznawanie mowy. Klucz lub token autoryzacji jest opcjonalny.
- Użyj hosta i przekaż adres hosta. Klucz lub token autoryzacji jest opcjonalny.
- Użyj tokenu autoryzacji ze skojarzonym regionem/lokalizacją.
Uwaga
Niezależnie od tego, czy wykonujesz rozpoznawanie mowy, syntezę mowy, tłumaczenie, czy rozpoznawanie intencji, zawsze utworzysz konfigurację.
Rozpoznawanie mowy przy użyciu mikrofonu
Aby rozpoznawać mowę AudioConfig
przy użyciu mikrofonu urządzenia, utwórz wystąpienie przy użyciu fromDefaultMicrophoneInput()
metody . Następnie zainicjuj SpeechRecognizer
obiekt, przekazując audioConfig
polecenie i config
.
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public class Program {
public static void main(String[] args) throws InterruptedException, ExecutionException {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key>", "<paste-your-region>");
fromMic(speechConfig);
}
public static void fromMic(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
AudioConfig audioConfig = AudioConfig.fromDefaultMicrophoneInput();
SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
System.out.println("Speak into your microphone.");
Future<SpeechRecognitionResult> task = speechRecognizer.recognizeOnceAsync();
SpeechRecognitionResult speechRecognitionResult = task.get();
System.out.println("RECOGNIZED: Text=" + speechRecognitionResult.getText());
}
}
Jeśli chcesz użyć określonego urządzenia wejściowego audio, musisz określić identyfikator urządzenia w pliku AudioConfig
. Aby dowiedzieć się, jak uzyskać identyfikator urządzenia, zobacz Select an audio input device with the Speech SDK (Wybieranie urządzenia wejściowego audio przy użyciu zestawu SDK usługi Mowa).
Rozpoznawanie mowy z pliku
Jeśli chcesz rozpoznawać mowę z pliku audio zamiast używać mikrofonu, nadal musisz utworzyć AudioConfig
wystąpienie. Jednak nie wywołujesz metody FromDefaultMicrophoneInput()
. fromWavFileInput()
Wywołasz metodę i przekażesz ścieżkę pliku:
import com.microsoft.cognitiveservices.speech.*;
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public class Program {
public static void main(String[] args) throws InterruptedException, ExecutionException {
SpeechConfig speechConfig = SpeechConfig.fromSubscription("<paste-your-speech-key>", "<paste-your-region>");
fromFile(speechConfig);
}
public static void fromFile(SpeechConfig speechConfig) throws InterruptedException, ExecutionException {
AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig, audioConfig);
Future<SpeechRecognitionResult> task = speechRecognizer.recognizeOnceAsync();
SpeechRecognitionResult speechRecognitionResult = task.get();
System.out.println("RECOGNIZED: Text=" + speechRecognitionResult.getText());
}
}
Obsługa błędów
Poprzednie przykłady pobierają tylko rozpoznany tekst przy użyciu polecenia speechRecognitionResult.getText()
. Aby obsłużyć błędy i inne odpowiedzi, musisz napisać kod, aby obsłużyć wynik. Poniższy przykład ocenia speechRecognitionResult.getReason()
i:
- Wyświetla wynik rozpoznawania:
ResultReason.RecognizedSpeech
. - Jeśli nie ma dopasowania do rozpoznawania, informuje użytkownika:
ResultReason.NoMatch
. - Jeśli wystąpi błąd, zostanie wyświetlony komunikat o błędzie:
ResultReason.Canceled
.
switch (speechRecognitionResult.getReason()) {
case ResultReason.RecognizedSpeech:
System.out.println("We recognized: " + speechRecognitionResult.getText());
exitCode = 0;
break;
case ResultReason.NoMatch:
System.out.println("NOMATCH: Speech could not be recognized.");
break;
case ResultReason.Canceled: {
CancellationDetails cancellation = CancellationDetails.fromResult(speechRecognitionResult);
System.out.println("CANCELED: Reason=" + cancellation.getReason());
if (cancellation.getReason() == CancellationReason.Error) {
System.out.println("CANCELED: ErrorCode=" + cancellation.getErrorCode());
System.out.println("CANCELED: ErrorDetails=" + cancellation.getErrorDetails());
System.out.println("CANCELED: Did you set the speech resource key and region values?");
}
}
break;
}
Korzystanie z funkcji ciągłego rozpoznawania
W poprzednich przykładach użyto funkcji rozpoznawania pojedynczego strzału, która rozpoznaje jedną wypowiedź. Koniec pojedynczej wypowiedzi jest określany przez nasłuchiwanie ciszy na końcu lub do momentu przetworzenia maksymalnie 15 sekund dźwięku.
Natomiast używasz funkcji rozpoznawania ciągłego, gdy chcesz kontrolować, kiedy zatrzymać rozpoznawanie. Wymaga ona zasubskrybowania zdarzeń recognizing
, recognized
i canceled
w celu uzyskania wyników rozpoznawania. Aby zatrzymać rozpoznawanie, należy wywołać metodę stopContinuousRecognitionAsync
. Oto przykładowy sposób wykonywania ciągłego rozpoznawania w pliku wejściowym audio.
Zacznij od zdefiniowania danych wejściowych i inicjowania SpeechRecognizer
:
AudioConfig audioConfig = AudioConfig.fromWavFileInput("YourAudioFile.wav");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(config, audioConfig);
Następnie utwórz zmienną do zarządzania stanem rozpoznawania mowy. Zadeklaruj Semaphore
wystąpienie w zakresie klasy:
private static Semaphore stopTranslationWithFileSemaphore;
Następnie zasubskrybuj zdarzenia, które SpeechRecognizer
wysyła:
recognizing
: Sygnał dla zdarzeń zawierających wyniki rozpoznawania pośredniego.recognized
: sygnał dla zdarzeń zawierających końcowe wyniki rozpoznawania, które wskazują pomyślną próbę rozpoznawania.sessionStopped
: Sygnał dla zdarzeń, które wskazują koniec sesji rozpoznawania (operacja).canceled
: Sygnał dla zdarzeń zawierających anulowane wyniki rozpoznawania. Te wyniki wskazują próbę rozpoznawania, która została anulowana w wyniku żądania bezpośredniego anulowania. Alternatywnie wskazują one awarię transportu lub protokołu.
// First initialize the semaphore.
stopTranslationWithFileSemaphore = new Semaphore(0);
speechRecognizer.recognizing.addEventListener((s, e) -> {
System.out.println("RECOGNIZING: Text=" + e.getResult().getText());
});
speechRecognizer.recognized.addEventListener((s, e) -> {
if (e.getResult().getReason() == ResultReason.RecognizedSpeech) {
System.out.println("RECOGNIZED: Text=" + e.getResult().getText());
}
else if (e.getResult().getReason() == ResultReason.NoMatch) {
System.out.println("NOMATCH: Speech could not be recognized.");
}
});
speechRecognizer.canceled.addEventListener((s, e) -> {
System.out.println("CANCELED: Reason=" + e.getReason());
if (e.getReason() == CancellationReason.Error) {
System.out.println("CANCELED: ErrorCode=" + e.getErrorCode());
System.out.println("CANCELED: ErrorDetails=" + e.getErrorDetails());
System.out.println("CANCELED: Did you set the speech resource key and region values?");
}
stopTranslationWithFileSemaphore.release();
});
speechRecognizer.sessionStopped.addEventListener((s, e) -> {
System.out.println("\n Session stopped event.");
stopTranslationWithFileSemaphore.release();
});
Po skonfigurowaniu wszystkiego wywołaj metodę startContinuousRecognitionAsync
, aby rozpocząć rozpoznawanie:
// Starts continuous recognition. Uses StopContinuousRecognitionAsync() to stop recognition.
speechRecognizer.startContinuousRecognitionAsync().get();
// Waits for completion.
stopTranslationWithFileSemaphore.acquire();
// Stops recognition.
speechRecognizer.stopContinuousRecognitionAsync().get();
Zmienianie języka źródłowego
Typowym zadaniem rozpoznawania mowy jest określenie języka wejściowego (lub źródłowego). W poniższym przykładzie pokazano, jak zmienić język wejściowy na francuski. W kodzie znajdź SpeechConfig
wystąpienie i dodaj ten wiersz bezpośrednio poniżej:
config.setSpeechRecognitionLanguage("fr-FR");
setSpeechRecognitionLanguage
jest parametrem, który przyjmuje ciąg jako argument. Zapoznaj się z listą obsługiwanych ustawień regionalnych mowy do tekstu.
Identyfikacja języka
Można użyć identyfikacji języka z rozpoznawaniem mowy do rozpoznawania tekstu, gdy trzeba zidentyfikować język w źródle audio, a następnie transkrybować go do tekstu.
Aby zapoznać się z kompletnym przykładem kodu, zobacz Identyfikacja języka.
Używanie niestandardowego punktu końcowego
Za pomocą mowy niestandardowej możesz przekazać własne dane, przetestować i wytrenować model niestandardowy, porównać dokładność między modelami i wdrożyć model w niestandardowym punkcie końcowym. W poniższym przykładzie pokazano, jak ustawić niestandardowy punkt końcowy:
SpeechConfig speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourServiceRegion");
speechConfig.setEndpointId("YourEndpointId");
SpeechRecognizer speechRecognizer = new SpeechRecognizer(speechConfig);
Uruchamianie i używanie kontenera
Kontenery mowy udostępniają internetowe interfejsy API punktów końcowych zapytań oparte na protokole Websocket, które są dostępne za pośrednictwem zestawu SPEECH SDK i interfejsu wiersza polecenia usługi Mowa. Domyślnie zestaw SDK usługi Mowa i interfejs wiersza polecenia usługi Mowa używają publicznej usługi rozpoznawania mowy. Aby użyć kontenera, należy zmienić metodę inicjowania. Użyj adresu URL hosta kontenera zamiast klucza i regionu.
Aby uzyskać więcej informacji na temat kontenerów, zobacz Host URL in Install and run Speech containers with Docker (Adresy URL hostów w temacie Instalowanie i uruchamianie kontenerów usługi Mowa za pomocą platformy Docker).
Segmentacja semantyczna
Segmentacja semantyczna to strategia segmentacji rozpoznawania mowy zaprojektowana w celu ograniczenia problemów związanych z segmentacją opartą na ciszy:
- Under-segmentation: Gdy użytkownicy mówią przez długi czas bez przerw, mogą zobaczyć długą sekwencję tekstu bez podziałów ("ściana tekstu"), co poważnie obniża ich czytelność.
- Nadmierna segmentacja: gdy użytkownik wstrzymuje się przez krótki czas, mechanizm wykrywania ciszy może niepoprawnie podzielić segmenty.
Zamiast polegać na przekroczeniu limitów czasu ciszy, segmentacja semantyczna i zwraca końcowe wyniki, gdy wykrywa znaki interpunkcyjne kończące zdanie (np. ""." lub "?"). Poprawia to środowisko użytkownika dzięki wyższej jakości, semantycznie kompletnym segmentom i zapobiega długim wynikom pośrednim.
Aby użyć segmentacji semantycznej, należy ustawić następującą właściwość w wystąpieniu SpeechConfig
użytym do utworzenia elementu SpeechRecognizer
:
speechConfig.SetProperty(PropertyId.Speech_SegmentationStrategy, "Semantic");
Niektóre ograniczenia segmentacji semantycznej są następujące:
- Do korzystania z segmentacji semantycznej potrzebny jest zestaw Speech SDK w wersji 1.41 lub nowszej.
- Segmentacja semantyczna jest przeznaczona tylko do użytku w funkcji ciągłego rozpoznawania. Obejmuje to scenariusze, takie jak transkrypcja i transkrypcja. Nie należy jej używać w trybie rozpoznawania pojedynczego i dyktowania.
- Segmentacja semantyczna nie jest dostępna dla wszystkich języków i ustawień regionalnych. Obecnie segmentacja semantyczna jest dostępna tylko dla ustawień regionalnych języka angielskiego (en), takich jak en-US, en-GB, en-IN i en-AU.
- Segmentacja semantyczna nie obsługuje jeszcze wyników ufności i list NBest. W związku z tym nie zalecamy segmentacji semantycznej, jeśli używasz współczynników ufności ani list NBest.
Dokumentacja referencyjna | Package (npm) | Dodatkowe przykłady w kodzie źródłowym biblioteki GitHub |
W tym przewodniku z instrukcjami dowiesz się, jak używać usługi Azure AI Speech do konwersji tekstu w czasie rzeczywistym. Rozpoznawanie mowy w czasie rzeczywistym jest idealne dla aplikacji wymagających natychmiastowej transkrypcji, takich jak dyktowanie, pomoc w centrum obsługi telefonicznej i transkrypcja na żywo.
Aby dowiedzieć się, jak skonfigurować środowisko dla przykładowej aplikacji, zobacz Szybki start: rozpoznawanie i konwertowanie mowy na tekst.
Tworzenie wystąpienia konfiguracji mowy
Aby wywołać usługę Rozpoznawanie mowy przy użyciu zestawu SPEECH SDK, należy utworzyć SpeechConfig
wystąpienie. Ta klasa zawiera informacje o subskrypcji, takie jak klucz i skojarzony region, punkt końcowy, host lub token autoryzacji.
- Utwórz zasób usługi Mowa w witrynie Azure Portal. Pobierz klucz zasobu usługi Mowa i region.
SpeechConfig
Utwórz wystąpienie przy użyciu następującego kodu. ZastąpYourSpeechKey
wartości iYourSpeechRegion
kluczem zasobu usługi Mowa i regionem.
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
Można zainicjować SpeechConfig
na kilka innych sposobów:
- Użyj punktu końcowego i przekaż punkt końcowy usługi Rozpoznawanie mowy. Klucz lub token autoryzacji jest opcjonalny.
- Użyj hosta i przekaż adres hosta. Klucz lub token autoryzacji jest opcjonalny.
- Użyj tokenu autoryzacji ze skojarzonym regionem/lokalizacją.
Uwaga
Niezależnie od tego, czy wykonujesz rozpoznawanie mowy, syntezę mowy, tłumaczenie, czy rozpoznawanie intencji, zawsze tworzysz konfigurację.
Rozpoznawanie mowy przy użyciu mikrofonu
Rozpoznawanie mowy z mikrofonu nie jest obsługiwane w Node.js. Jest on obsługiwany tylko w środowisku JavaScript opartym na przeglądarce. Aby uzyskać więcej informacji, zobacz przykład React i implementację mowy na tekst z mikrofonu w usłudze GitHub. Przykład platformy React przedstawia wzorce projektowe dotyczące wymiany tokenów uwierzytelniania i zarządzania nimi. Przedstawia również przechwytywanie dźwięku z mikrofonu lub pliku do konwersji mowy na tekst.
Uwaga
Jeśli chcesz użyć określonego urządzenia wejściowego audio, musisz określić identyfikator urządzenia w pliku AudioConfig
. Aby dowiedzieć się, jak uzyskać identyfikator urządzenia, zobacz Select an audio input device with the Speech SDK (Wybieranie urządzenia wejściowego audio przy użyciu zestawu SDK usługi Mowa).
Rozpoznawanie mowy z pliku
Aby rozpoznać mowę AudioConfig
z pliku audio, utwórz wystąpienie przy użyciu fromWavFileInput()
metody , która akceptuje Buffer
obiekt. Następnie zainicjuj SpeechRecognizer
, przekazując audioConfig
i speechConfig
.
const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
function fromFile() {
let audioConfig = sdk.AudioConfig.fromWavFileInput(fs.readFileSync("YourAudioFile.wav"));
let speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
speechRecognizer.recognizeOnceAsync(result => {
console.log(`RECOGNIZED: Text=${result.text}`);
speechRecognizer.close();
});
}
fromFile();
Rozpoznawanie mowy ze strumienia w pamięci
W wielu przypadkach użycia dane audio prawdopodobnie pochodzą z usługi Azure Blob Storage. Lub jest już w pamięci jako ArrayBuffer
lub podobnej pierwotnej struktury danych. Następujący kod powoduje:
- Tworzy strumień wypychania przy użyciu polecenia
createPushStream()
. - Odczytuje plik .wav przy użyciu
fs.createReadStream
do celów demonstracyjnych. Jeśli masz już dane audio w programieArrayBuffer
, możesz przejść bezpośrednio do zapisywania zawartości w strumieniu wejściowym. - Tworzy konfigurację dźwięku przy użyciu strumienia wypychania.
const fs = require('fs');
const sdk = require("microsoft-cognitiveservices-speech-sdk");
const speechConfig = sdk.SpeechConfig.fromSubscription("YourSpeechKey", "YourSpeechRegion");
function fromStream() {
let pushStream = sdk.AudioInputStream.createPushStream();
fs.createReadStream("YourAudioFile.wav").on('data', function(arrayBuffer) {
pushStream.write(arrayBuffer.slice());
}).on('end', function() {
pushStream.close();
});
let audioConfig = sdk.AudioConfig.fromStreamInput(pushStream);
let speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
speechRecognizer.recognizeOnceAsync(result => {
console.log(`RECOGNIZED: Text=${result.text}`);
speechRecognizer.close();
});
}
fromStream();
Użycie strumienia wypychania jako danych wejściowych zakłada, że dane audio są nieprzetworzonymi danymi modulacji kodu impulsowego (PCM), które pomijają wszystkie nagłówki. Interfejs API nadal działa w niektórych przypadkach, jeśli nagłówek nie zostanie pominięty. Aby uzyskać najlepsze wyniki, rozważ zaimplementowanie logiki w celu odczytania nagłówków tak, aby fs
zaczynały się od początku danych dźwiękowych.
Obsługa błędów
Poprzednie przykłady pobierają tylko rozpoznany tekst z result.text
właściwości . Aby obsłużyć błędy i inne odpowiedzi, musisz napisać kod, aby obsłużyć wynik. Poniższy kod ocenia result.reason
właściwość i:
- Wyświetla wynik rozpoznawania:
ResultReason.RecognizedSpeech
. - Jeśli nie ma dopasowania do rozpoznawania, informuje użytkownika:
ResultReason.NoMatch
. - Jeśli wystąpi błąd, zostanie wyświetlony komunikat o błędzie:
ResultReason.Canceled
.
switch (result.reason) {
case sdk.ResultReason.RecognizedSpeech:
console.log(`RECOGNIZED: Text=${result.text}`);
break;
case sdk.ResultReason.NoMatch:
console.log("NOMATCH: Speech could not be recognized.");
break;
case sdk.ResultReason.Canceled:
const cancellation = sdk.CancellationDetails.fromResult(result);
console.log(`CANCELED: Reason=${cancellation.reason}`);
if (cancellation.reason == sdk.CancellationReason.Error) {
console.log(`CANCELED: ErrorCode=${cancellation.ErrorCode}`);
console.log(`CANCELED: ErrorDetails=${cancellation.errorDetails}`);
console.log("CANCELED: Did you set the speech resource key and region values?");
}
break;
}
Korzystanie z funkcji ciągłego rozpoznawania
W poprzednich przykładach użyto funkcji rozpoznawania pojedynczego strzału, która rozpoznaje jedną wypowiedź. Koniec pojedynczej wypowiedzi jest określany przez nasłuchiwanie ciszy na końcu lub do momentu przetworzenia maksymalnie 15 sekund dźwięku.
Z kolei możesz użyć funkcji rozpoznawania ciągłego, gdy chcesz kontrolować, kiedy zatrzymać rozpoznawanie. Wymaga ona zasubskrybowania zdarzeń Recognizing
, Recognized
i Canceled
w celu uzyskania wyników rozpoznawania. Aby zatrzymać rozpoznawanie, musisz wywołać metodę [stopContinuousRecognitionAsync
] (/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer#microsoft-cognitiveservices-speech-speechrecognizer-stopcontinuousrecognitionasync). Oto przykład sposobu wykonywania ciągłego rozpoznawania w pliku wejściowym audio.
Zacznij od zdefiniowania danych wejściowych i inicjowania SpeechRecognizer
:
const speechRecognizer = new sdk.SpeechRecognizer(speechConfig, audioConfig);
Następnie zasubskrybuj zdarzenia wysyłane z programu SpeechRecognizer
:
recognizing
: Sygnał dla zdarzeń zawierających wyniki rozpoznawania pośredniego.recognized
: sygnał dla zdarzeń zawierających końcowe wyniki rozpoznawania, które wskazują pomyślną próbę rozpoznawania.sessionStopped
: Sygnał dla zdarzeń, które wskazują koniec sesji rozpoznawania (operacja).canceled
: Sygnał dla zdarzeń zawierających anulowane wyniki rozpoznawania. Te wyniki wskazują próbę rozpoznawania, która została anulowana w wyniku żądania bezpośredniego anulowania. Alternatywnie wskazują one awarię transportu lub protokołu.
speechRecognizer.recognizing = (s, e) => {
console.log(`RECOGNIZING: Text=${e.result.text}`);
};
speechRecognizer.recognized = (s, e) => {
if (e.result.reason == sdk.ResultReason.RecognizedSpeech) {
console.log(`RECOGNIZED: Text=${e.result.text}`);
}
else if (e.result.reason == sdk.ResultReason.NoMatch) {
console.log("NOMATCH: Speech could not be recognized.");
}
};
speechRecognizer.canceled = (s, e) => {
console.log(`CANCELED: Reason=${e.reason}`);
if (e.reason == sdk.CancellationReason.Error) {
console.log(`"CANCELED: ErrorCode=${e.errorCode}`);
console.log(`"CANCELED: ErrorDetails=${e.errorDetails}`);
console.log("CANCELED: Did you set the speech resource key and region values?");
}
speechRecognizer.stopContinuousRecognitionAsync();
};
speechRecognizer.sessionStopped = (s, e) => {
console.log("\n Session stopped event.");
speechRecognizer.stopContinuousRecognitionAsync();
};
Po skonfigurowaniu wszystkiego wywołaj metodę [startContinuousRecognitionAsync
] (/javascript/api/microsoft-cognitiveservices-speech-sdk/speechrecognizer#microsoft-cognitiveservices-speech-speechrecognizer-startkeywordrecognitionasync), aby rozpocząć rozpoznawanie:
speechRecognizer.startContinuousRecognitionAsync();
// Make the following call at some point to stop recognition:
// speechRecognizer.stopContinuousRecognitionAsync();
Zmienianie języka źródłowego
Typowym zadaniem rozpoznawania mowy jest określenie języka wejściowego (lub źródłowego). W poniższym przykładzie pokazano, jak zmienić język wejściowy na włoski. W kodzie znajdź SpeechConfig
wystąpienie i dodaj ten wiersz bezpośrednio pod nim:
speechConfig.speechRecognitionLanguage = "it-IT";
Właściwość speechRecognitionLanguage
oczekuje ciągu formatu ustawień regionalnych języka. Aby uzyskać listę obsługiwanych ustawień regionalnych, zobacz Obsługa języka i głosu dla usługi Mowa.
Identyfikacja języka
Można użyć identyfikacji języka z rozpoznawaniem mowy do rozpoznawania tekstu, gdy trzeba zidentyfikować język w źródle audio, a następnie transkrybować go do tekstu.
Aby zapoznać się z kompletnym przykładem kodu, zobacz Identyfikacja języka.
Używanie niestandardowego punktu końcowego
Za pomocą mowy niestandardowej możesz przekazać własne dane, przetestować i wytrenować model niestandardowy, porównać dokładność między modelami i wdrożyć model w niestandardowym punkcie końcowym. W poniższym przykładzie pokazano, jak ustawić niestandardowy punkt końcowy.
var speechConfig = SpeechSDK.SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
var speechRecognizer = new SpeechSDK.SpeechRecognizer(speechConfig);
Uruchamianie i używanie kontenera
Kontenery mowy udostępniają internetowe interfejsy API punktów końcowych zapytań oparte na protokole Websocket, które są dostępne za pośrednictwem zestawu SPEECH SDK i interfejsu wiersza polecenia usługi Mowa. Domyślnie zestaw SDK usługi Mowa i interfejs wiersza polecenia usługi Mowa używają publicznej usługi rozpoznawania mowy. Aby użyć kontenera, należy zmienić metodę inicjowania. Użyj adresu URL hosta kontenera zamiast klucza i regionu.
Aby uzyskać więcej informacji na temat kontenerów, zobacz Host URL in Install and run Speech containers with Docker (Adresy URL hostów w temacie Instalowanie i uruchamianie kontenerów usługi Mowa za pomocą platformy Docker).
Dokumentacja referencyjna Package (download) | Dodatkowe przykłady w usłudze GitHub |
W tym przewodniku z instrukcjami dowiesz się, jak używać usługi Azure AI Speech do konwersji tekstu w czasie rzeczywistym. Rozpoznawanie mowy w czasie rzeczywistym jest idealne dla aplikacji wymagających natychmiastowej transkrypcji, takich jak dyktowanie, pomoc w centrum obsługi telefonicznej i transkrypcja na żywo.
Aby dowiedzieć się, jak skonfigurować środowisko dla przykładowej aplikacji, zobacz Szybki start: rozpoznawanie i konwertowanie mowy na tekst.
Instalowanie zestawu SPEECH SDK i przykładów
Repozytorium Azure-Samples/cognitive-services-speech-sdk zawiera przykłady napisane w języku Objective-C dla systemów iOS i Mac. Wybierz link, aby wyświetlić instrukcje instalacji dla każdego przykładu:
- Rozpoznawanie mowy z mikrofonu w języku Objective-C w systemie macOS
- Rozpoznawanie mowy w języku Objective-C w systemie iOS
- Więcej przykładów dla języka Objective-C w systemie iOS
Aby uzyskać więcej informacji, zobacz dokumentację zestawu SPEECH SDK dla języka Objective-C.
Używanie niestandardowego punktu końcowego
Za pomocą mowy niestandardowej możesz przekazać własne dane, przetestować i wytrenować model niestandardowy, porównać dokładność między modelami i wdrożyć model w niestandardowym punkcie końcowym. W poniższym przykładzie pokazano, jak ustawić niestandardowy punkt końcowy:
SPXSpeechConfiguration *speechConfig = [[SPXSpeechConfiguration alloc] initWithSubscription:"YourSubscriptionKey" region:"YourServiceRegion"];
speechConfig.endpointId = "YourEndpointId";
SPXSpeechRecognizer* speechRecognizer = [[SPXSpeechRecognizer alloc] init:speechConfig];
Uruchamianie i używanie kontenera
Kontenery mowy udostępniają internetowe interfejsy API punktów końcowych zapytań oparte na protokole Websocket, które są dostępne za pośrednictwem zestawu SPEECH SDK i interfejsu wiersza polecenia usługi Mowa. Domyślnie zestaw SDK usługi Mowa i interfejs wiersza polecenia usługi Mowa używają publicznej usługi rozpoznawania mowy. Aby użyć kontenera, należy zmienić metodę inicjowania. Użyj adresu URL hosta kontenera zamiast klucza i regionu.
Aby uzyskać więcej informacji na temat kontenerów, zobacz Host URL in Install and run Speech containers with Docker (Adresy URL hostów w temacie Instalowanie i uruchamianie kontenerów usługi Mowa za pomocą platformy Docker).
Dokumentacja referencyjna Package (download) | Dodatkowe przykłady w usłudze GitHub |
W tym przewodniku z instrukcjami dowiesz się, jak używać usługi Azure AI Speech do konwersji tekstu w czasie rzeczywistym. Rozpoznawanie mowy w czasie rzeczywistym jest idealne dla aplikacji wymagających natychmiastowej transkrypcji, takich jak dyktowanie, pomoc w centrum obsługi telefonicznej i transkrypcja na żywo.
Aby dowiedzieć się, jak skonfigurować środowisko dla przykładowej aplikacji, zobacz Szybki start: rozpoznawanie i konwertowanie mowy na tekst.
Instalowanie zestawu SPEECH SDK i przykładów
Repozytorium Azure-Samples/cognitive-services-speech-sdk zawiera przykłady napisane w języku Swift dla systemów iOS i Mac. Wybierz link, aby wyświetlić instrukcje instalacji dla każdego przykładu:
Aby uzyskać więcej informacji, zobacz dokumentację zestawu SPEECH SDK dla języka Objective-C.
Używanie niestandardowego punktu końcowego
Za pomocą mowy niestandardowej możesz przekazać własne dane, przetestować i wytrenować model niestandardowy, porównać dokładność między modelami i wdrożyć model w niestandardowym punkcie końcowym. W poniższym przykładzie pokazano, jak ustawić niestandardowy punkt końcowy:
let speechConfig = SPXSpeechConfiguration(subscription: "YourSubscriptionKey", region: "YourServiceRegion");
speechConfig.endpointId = "YourEndpointId";
let speechRecognizer = SPXSpeechRecognizer(speechConfiguration: speechConfig);
Uruchamianie i używanie kontenera
Kontenery mowy udostępniają internetowe interfejsy API punktów końcowych zapytań oparte na protokole Websocket, które są dostępne za pośrednictwem zestawu SPEECH SDK i interfejsu wiersza polecenia usługi Mowa. Domyślnie zestaw SDK usługi Mowa i interfejs wiersza polecenia usługi Mowa używają publicznej usługi rozpoznawania mowy. Aby użyć kontenera, należy zmienić metodę inicjowania. Użyj adresu URL hosta kontenera zamiast klucza i regionu.
Aby uzyskać więcej informacji na temat kontenerów, zobacz Host URL in Install and run Speech containers with Docker (Adresy URL hostów w temacie Instalowanie i uruchamianie kontenerów usługi Mowa za pomocą platformy Docker).
Dokumentacja referencyjna | Package (PyPi) | Dodatkowe przykłady w witrynie GitHub
W tym przewodniku z instrukcjami dowiesz się, jak używać usługi Azure AI Speech do konwersji tekstu w czasie rzeczywistym. Rozpoznawanie mowy w czasie rzeczywistym jest idealne dla aplikacji wymagających natychmiastowej transkrypcji, takich jak dyktowanie, pomoc w centrum obsługi telefonicznej i transkrypcja na żywo.
Aby dowiedzieć się, jak skonfigurować środowisko dla przykładowej aplikacji, zobacz Szybki start: rozpoznawanie i konwertowanie mowy na tekst.
Tworzenie wystąpienia konfiguracji mowy
Aby wywołać usługę Rozpoznawanie mowy przy użyciu zestawu SPEECH SDK, należy utworzyć SpeechConfig
wystąpienie. Ta klasa zawiera informacje o subskrypcji, takie jak klucz mowy i skojarzony region, punkt końcowy, host lub token autoryzacji.
- Utwórz zasób usługi Mowa w witrynie Azure Portal. Pobierz klucz zasobu usługi Mowa i region.
SpeechConfig
Utwórz wystąpienie przy użyciu następującego kodu. ZastąpYourSpeechKey
wartości iYourSpeechRegion
kluczem zasobu usługi Mowa i regionem.
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
Można zainicjować SpeechConfig
na kilka innych sposobów:
- Użyj punktu końcowego i przekaż punkt końcowy usługi Rozpoznawanie mowy. Klucz mowy lub token autoryzacji jest opcjonalny.
- Użyj hosta i przekaż adres hosta. Klucz mowy lub token autoryzacji jest opcjonalny.
- Użyj tokenu autoryzacji ze skojarzonym regionem/lokalizacją.
Uwaga
Niezależnie od tego, czy wykonujesz rozpoznawanie mowy, syntezę mowy, tłumaczenie, czy rozpoznawanie intencji, zawsze tworzysz konfigurację.
Rozpoznawanie mowy przy użyciu mikrofonu
Aby rozpoznać mowę SpeechRecognizer
przy użyciu mikrofonu urządzenia, utwórz wystąpienie bez przekazywania AudioConfig
, a następnie przekaż polecenie speech_config
:
import azure.cognitiveservices.speech as speechsdk
def from_mic():
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)
print("Speak into your microphone.")
speech_recognition_result = speech_recognizer.recognize_once_async().get()
print(speech_recognition_result.text)
from_mic()
Jeśli chcesz użyć określonego urządzenia wejściowego audio, musisz określić identyfikator urządzenia w AudioConfig
pliku i przekazać go do parametru SpeechRecognizer
konstruktoraaudio_config
. Aby dowiedzieć się, jak uzyskać identyfikator urządzenia, zobacz Select an audio input device with the Speech SDK (Wybieranie urządzenia wejściowego audio przy użyciu zestawu SDK usługi Mowa).
Rozpoznawanie mowy z pliku
Jeśli chcesz rozpoznać mowę z pliku audio zamiast używać mikrofonu, utwórz AudioConfig
wystąpienie i użyj parametru filename
:
import azure.cognitiveservices.speech as speechsdk
def from_file():
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", region="YourSpeechRegion")
audio_config = speechsdk.AudioConfig(filename="your_file_name.wav")
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)
speech_recognition_result = speech_recognizer.recognize_once_async().get()
print(speech_recognition_result.text)
from_file()
Obsługa błędów
Poprzednie przykłady pobierają tylko rozpoznany tekst z speech_recognition_result.text
właściwości . Aby obsłużyć błędy i inne odpowiedzi, musisz napisać kod, aby obsłużyć wynik. Poniższy kod ocenia speech_recognition_result.reason
właściwość i:
- Wyświetla wynik rozpoznawania:
speechsdk.ResultReason.RecognizedSpeech
. - Jeśli nie ma dopasowania do rozpoznawania, informuje użytkownika:
speechsdk.ResultReason.NoMatch
. - Jeśli wystąpi błąd, zostanie wyświetlony komunikat o błędzie:
speechsdk.ResultReason.Canceled
.
if speech_recognition_result.reason == speechsdk.ResultReason.RecognizedSpeech:
print("Recognized: {}".format(speech_recognition_result.text))
elif speech_recognition_result.reason == speechsdk.ResultReason.NoMatch:
print("No speech could be recognized: {}".format(speech_recognition_result.no_match_details))
elif speech_recognition_result.reason == speechsdk.ResultReason.Canceled:
cancellation_details = speech_recognition_result.cancellation_details
print("Speech Recognition canceled: {}".format(cancellation_details.reason))
if cancellation_details.reason == speechsdk.CancellationReason.Error:
print("Error details: {}".format(cancellation_details.error_details))
print("Did you set the speech resource key and region values?")
Korzystanie z funkcji ciągłego rozpoznawania
W poprzednich przykładach użyto funkcji rozpoznawania pojedynczego strzału, która rozpoznaje jedną wypowiedź. Koniec pojedynczej wypowiedzi jest określany przez nasłuchiwanie ciszy na końcu lub do momentu przetworzenia maksymalnie 15 sekund dźwięku.
Natomiast używasz funkcji rozpoznawania ciągłego, gdy chcesz kontrolować, kiedy zatrzymać rozpoznawanie. Wymaga to nawiązania połączenia z usługą , aby EventSignal
uzyskać wyniki rozpoznawania. Aby zatrzymać rozpoznawanie, należy wywołać metodę stop_continuous_recognition() lub stop_continuous_recognition_async().. Oto przykład sposobu wykonywania ciągłego rozpoznawania w pliku wejściowym audio.
Zacznij od zdefiniowania danych wejściowych i inicjowania SpeechRecognizer
:
audio_config = speechsdk.audio.AudioConfig(filename=weatherfilename)
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)
Następnie utwórz zmienną do zarządzania stanem rozpoznawania mowy. Ustaw zmienną na , False
ponieważ na początku rozpoznawania można bezpiecznie założyć, że nie została zakończona:
done = False
Teraz utwórz wywołanie zwrotne, aby zatrzymać ciągłe rozpoznawanie po evt
odebraniu. Pamiętaj o tych kwestiach:
- Po
evt
odebraniuevt
zostanie wyświetlony komunikat. - Po
evt
odebraniu stop_continuous_recognition() jest wywoływana w celu zatrzymania rozpoznawania. - Stan rozpoznawania jest zmieniany na
True
.
def stop_cb(evt):
print('CLOSING on {}'.format(evt))
speech_recognizer.stop_continuous_recognition()
nonlocal done
done = True
Poniższy przykładowy kod pokazuje, jak połączyć wywołania zwrotne z zdarzeniami wysyłanymi z usługi SpeechRecognizer
. Dostępne są następujące zdarzenia:
recognizing
: Sygnał dla zdarzeń zawierających wyniki rozpoznawania pośredniego.recognized
: sygnał dla zdarzeń zawierających końcowe wyniki rozpoznawania, które wskazują pomyślną próbę rozpoznawania.session_started
: Sygnał dla zdarzeń, które wskazują początek sesji rozpoznawania (operacja).session_stopped
: Sygnał dla zdarzeń, które wskazują koniec sesji rozpoznawania (operacja).canceled
: Sygnał dla zdarzeń zawierających anulowane wyniki rozpoznawania. Te wyniki wskazują próbę rozpoznawania, która została anulowana w wyniku żądania bezpośredniego anulowania. Alternatywnie wskazują one awarię transportu lub protokołu.
speech_recognizer.recognizing.connect(lambda evt: print('RECOGNIZING: {}'.format(evt)))
speech_recognizer.recognized.connect(lambda evt: print('RECOGNIZED: {}'.format(evt)))
speech_recognizer.session_started.connect(lambda evt: print('SESSION STARTED: {}'.format(evt)))
speech_recognizer.session_stopped.connect(lambda evt: print('SESSION STOPPED {}'.format(evt)))
speech_recognizer.canceled.connect(lambda evt: print('CANCELED {}'.format(evt)))
speech_recognizer.session_stopped.connect(stop_cb)
speech_recognizer.canceled.connect(stop_cb)
Po skonfigurowaniu wszystkiego możesz wywołać metodę start_continuous_recognition():
speech_recognizer.start_continuous_recognition()
while not done:
time.sleep(.5)
Zmienianie języka źródłowego
Typowym zadaniem rozpoznawania mowy jest określenie języka wejściowego (lub źródłowego). W poniższym przykładzie pokazano, jak zmienić język wejściowy na niemiecki. W kodzie znajdź SpeechConfig
wystąpienie i dodaj ten wiersz bezpośrednio pod nim:
speech_config.speech_recognition_language="de-DE"
speech_recognition_language
jest parametrem, który przyjmuje ciąg jako argument. Aby uzyskać listę obsługiwanych ustawień regionalnych, zobacz Obsługa języka i głosu dla usługi Mowa.
Identyfikacja języka
Można użyć identyfikacji języka z rozpoznawaniem mowy do rozpoznawania tekstu, gdy trzeba zidentyfikować język w źródle audio, a następnie transkrybować go do tekstu.
Aby zapoznać się z kompletnym przykładem kodu, zobacz Identyfikacja języka.
Używanie niestandardowego punktu końcowego
Za pomocą mowy niestandardowej możesz przekazać własne dane, przetestować i wytrenować model niestandardowy, porównać dokładność między modelami i wdrożyć model w niestandardowym punkcie końcowym. W poniższym przykładzie pokazano, jak ustawić niestandardowy punkt końcowy.
speech_config = speechsdk.SpeechConfig(subscription="YourSubscriptionKey", region="YourServiceRegion")
speech_config.endpoint_id = "YourEndpointId"
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config)
Uruchamianie i używanie kontenera
Kontenery mowy udostępniają internetowe interfejsy API punktów końcowych zapytań oparte na protokole Websocket, które są dostępne za pośrednictwem zestawu SPEECH SDK i interfejsu wiersza polecenia usługi Mowa. Domyślnie zestaw SDK usługi Mowa i interfejs wiersza polecenia usługi Mowa używają publicznej usługi rozpoznawania mowy. Aby użyć kontenera, należy zmienić metodę inicjowania. Użyj adresu URL hosta kontenera zamiast klucza i regionu.
Aby uzyskać więcej informacji na temat kontenerów, zobacz Host URL in Install and run Speech containers with Docker (Adresy URL hostów w temacie Instalowanie i uruchamianie kontenerów usługi Mowa za pomocą platformy Docker).
Segmentacja semantyczna
Segmentacja semantyczna to strategia segmentacji rozpoznawania mowy zaprojektowana w celu ograniczenia problemów związanych z segmentacją opartą na ciszy:
- Under-segmentation: Gdy użytkownicy mówią przez długi czas bez przerw, mogą zobaczyć długą sekwencję tekstu bez podziałów ("ściana tekstu"), co poważnie obniża ich czytelność.
- Nadmierna segmentacja: gdy użytkownik wstrzymuje się przez krótki czas, mechanizm wykrywania ciszy może niepoprawnie podzielić segmenty.
Zamiast polegać na przekroczeniu limitów czasu ciszy, segmentacja semantyczna i zwraca końcowe wyniki, gdy wykrywa znaki interpunkcyjne kończące zdanie (np. ""." lub "?"). Poprawia to środowisko użytkownika dzięki wyższej jakości, semantycznie kompletnym segmentom i zapobiega długim wynikom pośrednim.
Aby użyć segmentacji semantycznej, należy ustawić następującą właściwość w wystąpieniu SpeechConfig
użytym do utworzenia elementu SpeechRecognizer
:
speech_config.set_property(speechsdk.PropertyId.Speech_SegmentationStrategy, "Semantic")
Niektóre ograniczenia segmentacji semantycznej są następujące:
- Do korzystania z segmentacji semantycznej potrzebny jest zestaw Speech SDK w wersji 1.41 lub nowszej.
- Segmentacja semantyczna jest przeznaczona tylko do użytku w funkcji ciągłego rozpoznawania. Obejmuje to scenariusze, takie jak transkrypcja i transkrypcja. Nie należy jej używać w trybie rozpoznawania pojedynczego i dyktowania.
- Segmentacja semantyczna nie jest dostępna dla wszystkich języków i ustawień regionalnych. Obecnie segmentacja semantyczna jest dostępna tylko dla ustawień regionalnych języka angielskiego (en), takich jak en-US, en-GB, en-IN i en-AU.
- Segmentacja semantyczna nie obsługuje jeszcze wyników ufności i list NBest. W związku z tym nie zalecamy segmentacji semantycznej, jeśli używasz współczynników ufności ani list NBest.
Interfejs API REST zamiany mowy na tekst — dokumentacja | interfejsu API REST zamiany mowy na tekst w celu uzyskania krótkiej dokumentacji | audio Dodatkowe przykłady w usłudze GitHub
W tym przewodniku z instrukcjami dowiesz się, jak używać usługi Azure AI Speech do konwersji tekstu w czasie rzeczywistym. Rozpoznawanie mowy w czasie rzeczywistym jest idealne dla aplikacji wymagających natychmiastowej transkrypcji, takich jak dyktowanie, pomoc w centrum obsługi telefonicznej i transkrypcja na żywo.
Aby dowiedzieć się, jak skonfigurować środowisko dla przykładowej aplikacji, zobacz Szybki start: rozpoznawanie i konwertowanie mowy na tekst.
Konwersja mowy na tekst
W wierszu polecenia uruchom następujące polecenie. Wstaw następujące wartości do polecenia:
- Klucz subskrypcji zasobu usługi Mowa
- Region usługi Rozpoznawanie mowy
- Ścieżka wejściowego pliku audio
curl --location --request POST 'https://INSERT_REGION_HERE.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=en-US' \
--header 'Ocp-Apim-Subscription-Key: INSERT_SUBSCRIPTION_KEY_HERE' \
--header 'Content-Type: audio/wav' \
--data-binary @'INSERT_AUDIO_FILE_PATH_HERE'
Powinna zostać wyświetlona odpowiedź podobna do poniższego przykładu:
{
"RecognitionStatus": "Success",
"DisplayText": "My voice is my passport, verify me.",
"Offset": 6600000,
"Duration": 32100000
}
Aby uzyskać więcej informacji, zobacz Dokumentacja interfejsu API REST zamiany mowy na tekst.
W tym przewodniku z instrukcjami dowiesz się, jak używać usługi Azure AI Speech do konwersji tekstu w czasie rzeczywistym. Rozpoznawanie mowy w czasie rzeczywistym jest idealne dla aplikacji wymagających natychmiastowej transkrypcji, takich jak dyktowanie, pomoc w centrum obsługi telefonicznej i transkrypcja na żywo.
Aby dowiedzieć się, jak skonfigurować środowisko dla przykładowej aplikacji, zobacz Szybki start: rozpoznawanie i konwertowanie mowy na tekst.
Rozpoznawanie mowy przy użyciu mikrofonu
Podłącz i włącz mikrofon komputera. Wyłącz wszystkie aplikacje, które mogą również używać mikrofonu. Niektóre komputery mają wbudowany mikrofon, natomiast inne wymagają konfiguracji urządzenia Bluetooth.
Teraz możesz uruchomić interfejs wiersza polecenia usługi Mowa w celu rozpoznawania mowy z mikrofonu. W wierszu polecenia przejdź do katalogu zawierającego plik binarny interfejsu wiersza polecenia usługi Mowa. Uruchom następujące polecenie:
spx recognize --microphone
Uwaga
Interfejs wiersza polecenia usługi Mowa jest domyślnie w języku angielskim. Możesz wybrać inny język od mowy do tabeli tekstowej. Dodaj na przykład, --source de-DE
aby rozpoznać mowę niemiecką.
Porozmawiaj z mikrofonem i możesz zobaczyć transkrypcję słów w tekście w czasie rzeczywistym. Interfejs wiersza polecenia usługi Mowa zatrzymuje się po upływie okresu ciszy lub po wybraniu Ctrl+C.
Rozpoznawanie mowy z pliku
Interfejs wiersza polecenia usługi Mowa może rozpoznawać mowę w wielu formatach plików i językach naturalnych. W tym przykładzie można użyć dowolnego pliku .wav (16 kHz lub 8 kHz, 16-bitowego i mono PCM), który zawiera mowę angielską. Możesz też pobrać plik whatstheweatherlike.wav i skopiować go do tego samego katalogu co plik binarny interfejsu wiersza polecenia usługi Mowa.
Użyj następującego polecenia, aby uruchomić interfejs wiersza polecenia usługi Mowa w celu rozpoznawania mowy znalezionej w pliku audio:
spx recognize --file whatstheweatherlike.wav
Uwaga
Interfejs wiersza polecenia usługi Mowa jest domyślnie w języku angielskim. Możesz wybrać inny język od mowy do tabeli tekstowej. Dodaj na przykład, --source de-DE
aby rozpoznać mowę niemiecką.
Interfejs wiersza polecenia usługi Mowa przedstawia transkrypcję tekstu mowy na ekranie.
Uruchamianie i używanie kontenera
Kontenery mowy udostępniają internetowe interfejsy API punktów końcowych zapytań oparte na protokole Websocket, które są dostępne za pośrednictwem zestawu SPEECH SDK i interfejsu wiersza polecenia usługi Mowa. Domyślnie zestaw SDK usługi Mowa i interfejs wiersza polecenia usługi Mowa używają publicznej usługi rozpoznawania mowy. Aby użyć kontenera, należy zmienić metodę inicjowania. Użyj adresu URL hosta kontenera zamiast klucza i regionu.
Aby uzyskać więcej informacji na temat kontenerów, zobacz Host URL in Install and run Speech containers with Docker (Adresy URL hostów w temacie Instalowanie i uruchamianie kontenerów usługi Mowa za pomocą platformy Docker).