Využívání zvukového vstupu komprimovaného pomocí kodeku
Sada Speech SDK a rozhraní příkazového řádku pro rozpoznávání řeči můžou přijímat komprimované zvukové formáty pomocí GStreamer. GStreamer dekomprimuje zvuk před jeho odesláním do služby Speech Service jako nezpracovaných PCM.
| Platforma | Jazyky | Podporovaná verze GStreamer |
|---|---|---|
| Linux | C++, C#, Java, Python, přejít | Podporované distribuce systému Linux a cílové architektury |
| Windows (s výjimkou UWP) | C++, C#, Java, Python | 1.18.3 |
| Android | Java | 1.18.3 |
Instalace GStreamer v systému Linux
Další informace najdete v tématu pokyny k instalaci pro Linux.
sudo apt install libgstreamer1.0-0 \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly
Instalace GStreamer na Windows
další informace najdete v tématu Windows pokyny k instalaci.
- Vytvoření složky c:\gstreamer
- Stažení instalačního programu
- Zkopírování instalačního programu do c:\gstreamer
- Spusťte PowerShell jako správce.
- V PowerShellu spusťte následující příkaz:
cd c:\gstreamer
msiexec /passive INSTALLLEVEL=1000 INSTALLDIR=C:\gstreamer /i gstreamer-1.0-msvc-x86_64-1.18.3.msi
- Přidat systémové proměnné GST_PLUGIN_PATH s hodnotou C:\gstreamer\1.0\ msvc_x86_64 \lib\gstreamer-1,0
- Přidat systémové proměnné GSTREAMER_ROOT_X86_64 s hodnotou C:\gstreamer\1.0\ msvc_x86_64
- Přidejte další položku v proměnné PATH jako C:\gstreamer\1.0\ msvc_x86_64 \Bin
- Restartovat počítač
Používání GStreamer v Androidu
Podrobnosti o vytváření libgstreamer_android najdete na kartě Java výše.
Další informace najdete v tématu pokyny k instalaci Androidu.
Pro komprimovaný zvukový vstup se vyžaduje verze sady Speech SDK.
- Pro RHEL 8 a CentOS 8 se vyžaduje sada Speech SDK verze 1.10.0 nebo novější.
- Pro Windows se vyžaduje sada Speech SDK verze 1.11.0 nebo novější.
- sada Speech SDK verze 1.16.0 nebo novější pro nejnovější GStreamer v Windows a androidu.
Výchozí formát streamování zvuku je WAV (16 kHz nebo 8 kHz, 16 bitů a mono PCM). Níže uvedené komprimované formáty vstupu, které jsou mimo zvuk WAV/PCM, jsou podporovány také pomocí GStreamer.
- MP3
- OPUS/OGG
- FLAC
- ALAW v kontejneru WAV
- MULAW v kontejneru WAV
- JAKÉKOLI (ve scénáři, kde není známý formát média)
GStreamer nutné ke zpracování komprimovaného zvuku
Zpracování komprimovaného zvuku se implementuje pomocí GStreameru. Binární soubory GStreameru se z důvodů licencování nekompilují a nesvázané se sadou Speech SDK. Vývojáři musí nainstalovat několik závislostí a modulů plug-in. Další informace najdete v tématu Instalace Windows nebo Instalace v Linuxu. Binární soubory GStreamer musí být v systémové cestě, aby sada Speech SDK za běhu načítá binární soubory. Pokud je například Windows Speech SDK během běhu schopná najít nebo (pro nejnovější GStreamer), znamená to, že binární soubory libgstreamer-1.0-0.dll GStreameru jsou v gstreamer-1.0-0.dll systémové cestě.
Zpracování komprimovaného zvuku se implementuje pomocí GStreameru. Z důvodů licencování se binární soubory GStreameru nezkompilují a nesvázané se sadou Speech SDK. Vývojáři musí nainstalovat několik závislostí a modulů plug-in.
Poznámka
Povinné obecné nastavení v Linuxu najdete v tématu Požadavky na systém a pokyny k nastavení.
sudo apt install libgstreamer1.0-0 \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly
Zpracování komprimovaného zvuku se implementuje pomocí GStreameru. Binární soubory GStreameru se z důvodů licencování nekompilují a nesvázané se sadou Speech SDK. Místo toho budete muset použít předem sestavené binární soubory pro Android. Pokud si chcete stáhnout předem sestavené knihovny, podívejte se na instalaci pro vývoj pro Android.
libgstreamer_android.so je povinné. Ujistěte se, že všechny moduly plug-in GStreamer (z Android.mk níže) jsou propojené v libgstreamer_android.so . Při použití nejnovější sady Speech SDK (1.16 a novější) s GStreamerem verze 1.18.3 se také vyžaduje, aby byla k dispozici od libc++_shared.so Android ndk.
GSTREAMER_PLUGINS := coreelements app audioconvert mpg123 \
audioresample audioparsers ogg opusparse \
opus wavparse alaw mulaw flac
Příklad a Android.mk Application.mk soubor jsou uvedeny níže. Postupujte podle těchto kroků a vytvořte gstreamer sdílený objekt: libgstreamer_android.so .
# Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := dummy
LOCAL_SHARED_LIBRARIES := gstreamer_android
include $(BUILD_SHARED_LIBRARY)
ifndef GSTREAMER_ROOT_ANDROID
$(error GSTREAMER_ROOT_ANDROID is not defined!)
endif
ifndef APP_BUILD_SCRIPT
$(error APP_BUILD_SCRIPT is not defined!)
endif
ifndef TARGET_ARCH_ABI
$(error TARGET_ARCH_ABI is not defined!)
endif
ifeq ($(TARGET_ARCH_ABI),armeabi)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm
else ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/armv7
else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/arm64
else ifeq ($(TARGET_ARCH_ABI),x86)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86
else ifeq ($(TARGET_ARCH_ABI),x86_64)
GSTREAMER_ROOT := $(GSTREAMER_ROOT_ANDROID)/x86_64
else
$(error Target arch ABI not supported: $(TARGET_ARCH_ABI))
endif
GSTREAMER_NDK_BUILD_PATH := $(GSTREAMER_ROOT)/share/gst-android/ndk-build/
include $(GSTREAMER_NDK_BUILD_PATH)/plugins.mk
GSTREAMER_PLUGINS := $(GSTREAMER_PLUGINS_CORE) \
$(GSTREAMER_PLUGINS_CODECS) \
$(GSTREAMER_PLUGINS_PLAYBACK) \
$(GSTREAMER_PLUGINS_CODECS_GPL) \
$(GSTREAMER_PLUGINS_CODECS_RESTRICTED)
GSTREAMER_EXTRA_LIBS := -liconv -lgstbase-1.0 -lGLESv2 -lEGL
include $(GSTREAMER_NDK_BUILD_PATH)/gstreamer-1.0.mk
# Application.mk
APP_STL = c++_shared
APP_PLATFORM = android-21
APP_BUILD_SCRIPT = Android.mk
K sestavení libgstreamer_android.so můžete použít následující příkaz v Ubuntu 18.04 nebo 20.04. Následující příkazové řádky byly testovány pouze pro GStreamer Android verze 1.14.4 s Androidem NDK b16b.
# Assuming wget and unzip already installed on the system
mkdir buildLibGstreamer
cd buildLibGstreamer
wget https://dl.google.com/android/repository/android-ndk-r16b-linux-x86_64.zip
unzip -q -o android-ndk-r16b-linux-x86_64.zip
export PATH=$PATH:$(pwd)/android-ndk-r16b
export NDK_PROJECT_PATH=$(pwd)/android-ndk-r16b
wget https://gstreamer.freedesktop.org/data/pkg/android/1.14.4/gstreamer-1.0-android-universal-1.14.4.tar.bz2
mkdir gstreamer_android
tar -xjf gstreamer-1.0-android-universal-1.14.4.tar.bz2 -C $(pwd)/gstreamer_android/
export GSTREAMER_ROOT_ANDROID=$(pwd)/gstreamer_android
mkdir gstreamer
# Copy the Application.mk and Android.mk from the documentation above and put it inside $(pwd)/gstreamer
# Enable only one of the following at one time to create the shared object for the targeted ABI
echo "building for armeabi-v7a. libgstreamer_android.so will be placed in $(pwd)/armeabi-v7a"
ndk-build -C $(pwd)/gstreamer "NDK_APPLICATION_MK=Application.mk" APP_ABI=armeabi-v7a NDK_LIBS_OUT=$(pwd)
#echo "building for arm64-v8a. libgstreamer_android.so will be placed in $(pwd)/arm64-v8a"
#ndk-build -C $(pwd)/gstreamer "NDK_APPLICATION_MK=Application.mk" APP_ABI=arm64-v8a NDK_LIBS_OUT=$(pwd)
#echo "building for x86_64. libgstreamer_android.so will be placed in $(pwd)/x86_64"
#ndk-build -C $(pwd)/gstreamer "NDK_APPLICATION_MK=Application.mk" APP_ABI=x86_64 NDK_LIBS_OUT=$(pwd)
#echo "building for x86. libgstreamer_android.so will be placed in $(pwd)/x86"
#ndk-build -C $(pwd)/gstreamer "NDK_APPLICATION_MK=Application.mk" APP_ABI=x86 NDK_LIBS_OUT=$(pwd)
Po sestavení sdíleného objektu ( ) musí vývojář aplikace umístit sdílený objekt do aplikace pro Android, aby ho bylo možné načíst pomocí libgstreamer_android.so sady Speech SDK.
Zpracování komprimovaného zvuku je implementováno pomocí GStreamer. Z důvodů licencování nejsou binární soubory GStreamer kompilovány a propojeny se sadou Speech SDK. vývojáři potřebují nainstalovat několik závislostí a modulů plug-in, přečtěte si téma instalace na Windows nebo instalace v systému Linux. GStreamer binární soubory musí být v systémové cestě, aby sada Speech SDK mohla načíst binární soubory za běhu. například pokud je sada Speech SDK schopná najít během běhu Windows, znamená to, že libgstreamer-1.0-0.dll binární soubory GStreamer jsou v systémové cestě.
Sada Speech SDK může pomocí GStreamer zvládnout komprimovaný zvuk. Z důvodů licencování se však neGStreamer binární soubory a jsou propojeny se sadou Speech SDK. Vývojáři potřebují nainstalovat několik závislostí a modulů plug-in, viz instalace v systému Linux. Jazyk je podporován pouze v sadě Speech SDK na platformě Linux. Podívejte se na téma sada Speech SDK for , kde můžete začít používat sadu Microsoft Speech SDK v prostředí přejít.
Příklad kódu pomocí komprimovaného zvukového vstupu kodeku
Pokud chcete sadu Speech SDK nakonfigurovat tak, aby přijímala komprimovaný zvukový vstup, vytvořte PullAudioInputStream nebo PushAudioInputStream . Pak vytvořte AudioConfig z instance vaší třídy streamu a určete formát komprese datového proudu. V části o rozhraní API audio vstupního streamu sady Speech SDKnajdete související fragmenty ukázek kódu.
Pojďme předpokládat, že máte třídu vstupního datového proudu nazvanou pullStream a používáte Opus/OGG. Váš kód může vypadat takto:
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
// ... omitted for brevity
var speechConfig =
SpeechConfig.FromSubscription(
"YourSubscriptionKey",
"YourServiceRegion");
// Create an audio config specifying the compressed
// audio format and the instance of your input stream class.
var audioFormat =
AudioStreamFormat.GetCompressedFormat(
AudioStreamContainerFormat.OGG_OPUS);
var audioConfig =
AudioConfig.FromStreamInput(
pullStream,
audioFormat);
using var recognizer = new SpeechRecognizer(speechConfig, audioConfig);
var result = await recognizer.RecognizeOnceAsync();
var text = result.Text;
Pokud chcete nakonfigurovat sadu Speech SDK tak, aby přijímal komprimovaný zvukový vstup, vytvořte PullAudioInputStream nebo PushAudioInputStream . Pak vytvořte z instance třídy datového proudu a určete formát AudioConfig komprese datového proudu. Ukázky souvisejícího vzorového kódu v sadě Speech SDK
Předpokládejme, že máte třídu vstupního streamu s názvem a pushStream používáte OPUS/OGG. Váš kód může vypadat asi takhle:
using namespace Microsoft::CognitiveServices::Speech;
using namespace Microsoft::CognitiveServices::Speech::Audio;
// ... omitted for brevity
auto config =
SpeechConfig::FromSubscription(
"YourSubscriptionKey",
"YourServiceRegion"
);
auto audioFormat =
AudioStreamFormat::GetCompressedFormat(
AudioStreamContainerFormat::OGG_OPUS
);
auto audioConfig =
AudioConfig::FromStreamInput(
pushStream,
audioFormat
);
auto recognizer = SpeechRecognizer::FromConfig(config, audioConfig);
auto result = recognizer->RecognizeOnceAsync().get();
auto text = result->Text;
Pokud chcete nakonfigurovat sadu Speech SDK tak, aby přijímal komprimovaný zvukový vstup, vytvořte PullAudioInputStream nebo PushAudioInputStream . Pak vytvořte z instance třídy datového proudu a určete formát AudioConfig komprese datového proudu. Ukázky souvisejícího vzorového kódu v sadě Speech SDK
Předpokládejme, že máte třídu vstupního streamu s názvem a pullStream používáte OPUS/OGG. Váš kód může vypadat asi takhle:
import com.microsoft.cognitiveservices.speech.audio.AudioConfig;
import com.microsoft.cognitiveservices.speech.audio.AudioInputStream;
import com.microsoft.cognitiveservices.speech.audio.AudioStreamFormat;
import com.microsoft.cognitiveservices.speech.audio.PullAudioInputStream;
import com.microsoft.cognitiveservices.speech.audio.AudioStreamContainerFormat;
// ... omitted for brevity
SpeechConfig speechConfig =
SpeechConfig.fromSubscription(
"YourSubscriptionKey",
"YourServiceRegion");
// Create an audio config specifying the compressed
// audio format and the instance of your input stream class.
AudioStreamFormat audioFormat =
AudioStreamFormat.getCompressedFormat(
AudioStreamContainerFormat.OGG_OPUS);
AudioConfig audioConfig =
AudioConfig.fromStreamInput(
pullStream,
audioFormat);
SpeechRecognizer recognizer = new SpeechRecognizer(speechConfig, audioConfig);
SpeechRecognitionResult result = recognizer.recognizeOnceAsync().get();
String text = result.getText();
Pokud chcete sadu Speech SDK nakonfigurovat tak, aby přijímala komprimovaný zvukový vstup, vytvořte PullAudioInputStream nebo PushAudioInputStream . Pak vytvořte AudioConfig z instance vaší třídy streamu a určete formát komprese datového proudu.
Pojďme předpokládat, že váš případ použití je používán PullStream pro MP3 soubor. Váš kód může vypadat takto:
import azure.cognitiveservices.speech as speechsdk
class BinaryFileReaderCallback(speechsdk.audio.PullAudioInputStreamCallback):
def __init__(self, filename: str):
super().__init__()
self._file_h = open(filename, "rb")
def read(self, buffer: memoryview) -> int:
print('trying to read {} frames'.format(buffer.nbytes))
try:
size = buffer.nbytes
frames = self._file_h.read(size)
buffer[:len(frames)] = frames
print('read {} frames'.format(len(frames)))
return len(frames)
except Exception as ex:
print('Exception in `read`: {}'.format(ex))
raise
def close(self) -> None:
print('closing file')
try:
self._file_h.close()
except Exception as ex:
print('Exception in `close`: {}'.format(ex))
raise
def compressed_stream_helper(compressed_format,
mp3_file_path,
default_speech_auth):
callback = BinaryFileReaderCallback(mp3_file_path)
stream = speechsdk.audio.PullAudioInputStream(stream_format=compressed_format, pull_stream_callback=callback)
speech_config = speechsdk.SpeechConfig(**default_speech_auth)
audio_config = speechsdk.audio.AudioConfig(stream=stream)
speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)
done = False
def stop_cb(evt):
"""callback that signals to stop continuous recognition upon receiving an event `evt`"""
print('CLOSING on {}'.format(evt))
nonlocal done
done = True
# Connect callbacks to the events fired by the speech recognizer
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)))
# stop continuous recognition on either session stopped or canceled events
speech_recognizer.session_stopped.connect(stop_cb)
speech_recognizer.canceled.connect(stop_cb)
# Start continuous speech recognition
speech_recognizer.start_continuous_recognition()
while not done:
time.sleep(.5)
speech_recognizer.stop_continuous_recognition()
# </SpeechContinuousRecognitionWithFile>
def pull_audio_input_stream_compressed_mp3(mp3_file_path: str,
default_speech_auth):
# Create a compressed format
compressed_format = speechsdk.audio.AudioStreamFormat(compressed_stream_format=speechsdk.AudioStreamContainerFormat.MP3)
compressed_stream_helper(compressed_format, mp3_file_path, default_speech_auth)
Pokud chcete sadu Speech SDK nakonfigurovat tak, aby přijímal komprimovaný zvukový vstup, vytvořte PullAudioInputStream nebo PushAudioInputStream . Pak vytvořte z instance třídy datového proudu a určete formát AudioConfig komprese datového proudu.
V následujícím příkladu předpokládejme, že váš případ použití se má použít PushStream pro komprimovaný soubor.
package recognizer
import (
"fmt"
"time"
"strings"
"github.com/Microsoft/cognitive-services-speech-sdk-go/audio"
"github.com/Microsoft/cognitive-services-speech-sdk-go/speech"
"github.com/Microsoft/cognitive-services-speech-sdk-go/samples/helpers"
)
func RecognizeOnceFromCompressedFile(subscription string, region string, file string) {
var containerFormat audio.AudioStreamContainerFormat
if strings.Contains(file, ".mulaw") {
containerFormat = audio.MULAW
} else if strings.Contains(file, ".alaw") {
containerFormat = audio.ALAW
} else if strings.Contains(file, ".mp3") {
containerFormat = audio.MP3
} else if strings.Contains(file, ".flac") {
containerFormat = audio.FLAC
} else if strings.Contains(file, ".opus") {
containerFormat = audio.OGGOPUS
} else {
containerFormat = audio.ANY
}
format, err := audio.GetCompressedFormat(containerFormat)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer format.Close()
stream, err := audio.CreatePushAudioInputStreamFromFormat(format)
if err != nil {
fmt.Println("Got an error: ", err)
return
}
defer stream.Close()
audioConfig, err := audio.NewAudioConfigFromStreamInput(stream)
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, ")")
})
helpers.PumpFileIntoStream(file, stream)
task := speechRecognizer.RecognizeOnceAsync()
var outcome speech.SpeechRecognitionOutcome
select {
case outcome = <-task:
case <-time.After(40 * 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)
}