Codec bileşeni sıkıştırılmış ses girişini kullanma

Konuşma SDK 'Sı ve konuşma CLı, GStreamer kullanarak sıkıştırılmış ses biçimlerini kabul edebilir. GStreamer, ses olarak konuşma hizmetine gönderilmeden önce sesi, ham PCM olarak açar.

Platform Diller Desteklenen GStreamer sürümü
Linux C++, C#, Java, Python, go Desteklenen Linux dağıtımları ve hedef mimarileri
Windows (UWP hariç) C++, C#, Java, Python 1.18.3
Android Java 1.18.3

Linux 'ta GStreamer yükleme

Daha fazla bilgi için bkz. Linux yükleme yönergeleri.

sudo apt install libgstreamer1.0-0 \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly

GStreamer ' i yükleme Windows

daha fazla bilgi için bkz. Windows yükleme yönergeleri.

  • Bir klasör oluşturun c:\gstreamer
  • Yükleyiciyi indir
  • Yükleyiciyi c:\gstreamer dizinine kopyalayın
  • PowerShell'i yönetici olarak açın.
  • PowerShell 'de aşağıdaki komutu çalıştırın:
cd c:\gstreamer
msiexec /passive INSTALLLEVEL=1000 INSTALLDIR=C:\gstreamer /i gstreamer-1.0-msvc-x86_64-1.18.3.msi
  • Sistem değişkenlerini GST_PLUGIN_PATH, C:\gstreamer\1.0\ msvc_x86_64 \lib\gstreamer-1,0 değerine ekleyin
  • Sistem değişkenlerini GSTREAMER_ROOT_X86_64 C:\gstreamer\1.0\ msvc_x86_64 değeriyle ekleyin
  • Yol değişkenine C:\gstreamer\1.0\ msvc_x86_64 \Bin olarak başka bir giriş ekleyin
  • Makineyi yeniden başlatın

Android 'de GStreamer kullanma

Libgstreamer_android oluşturma hakkında ayrıntılı bilgi için yukarıdaki Java sekmesine bakın.

Daha fazla bilgi için bkz. Android yükleme yönergeleri.

Sıkıştırılmış ses girişi için konuşma SDK sürümü gerekli

  • RHEL 8 ve CentOS 8 için konuşma SDK sürümü 1.10.0 veya üzeri gereklidir
  • Windows için konuşma SDK sürümü 1.11.0 veya üzeri gereklidir.
  • Windows ve Android 'de en son gstreamer için konuşma SDK sürümü 1.16.0 veya üzeri.

Varsayılan ses akış biçimi WAV 'dir (16 kHz veya 8 kHz, 16 bit ve mono PCM). WAV/PCM dışında, aşağıda listelenen sıkıştırılmış giriş biçimleri de GStreamer kullanılarak desteklenir.

  • ÇA
  • OPUS/OGG
  • FLAC
  • WAV w kapsayıcısında
  • WAV kapsayıcısında MULAW
  • ANY (medya biçiminin bilinen senaryosu Için)

Sıkıştırılmış sesi işlemek için GStreamer gerekiyor

Sıkıştırılmış sesi işleme GStreamer kullanılarak uygulanır. Lisanslama nedenleriyle GStreamer ikili dosyaları derlenmiş ve Konuşma SDK'sı ile bağlantılı değildir. Geliştiricilerin çeşitli bağımlılıkları ve eklentileri yüklemesi gerekir. Bkz. Windows yükleme veya Linux'ta Yükleme. Konuşma SDK'sı çalışma zamanı sırasında ikili dosyaları yükleyebilirken GStreamer ikili dosyaları sistem yolunda olmalıdır. Örneğin, Windows sırasında Konuşma SDK'sı veya (en son libgstreamer-1.0-0.dll GStreamer için) bulabilirse GStreamer ikili dosyaları sistem gstreamer-1.0-0.dll yolunda demektir.

Sıkıştırılmış ses işleme, GStreamerkullanılarak uygulanır. Lisanslama nedeniyle, GStreamer ikili dosyaları derlenmez ve konuşma SDK 'Sı ile bağlantılı değildir. Geliştiricilerin çeşitli bağımlılıklar ve eklentiler yüklemeleri gerekir.

Not

Linux üzerinde zorunlu genel kurulum için bkz. sistem gereksinimleri ve kurulum yönergeleri.

sudo apt install libgstreamer1.0-0 \
gstreamer1.0-plugins-base \
gstreamer1.0-plugins-good \
gstreamer1.0-plugins-bad \
gstreamer1.0-plugins-ugly

Sıkıştırılmış ses işleme, GStreamerkullanılarak uygulanır. Lisanslama nedeniyle, GStreamer ikili dosyaları derlenmez ve konuşma SDK 'Sı ile bağlantılı değildir. Bunun yerine, Android için önceden oluşturulmuş ikilileri kullanmanız gerekir. Önceden oluşturulmuş kitaplıkları indirmek için bkz. Android için yükleme geliştirme.

libgstreamer_android.so gereklidir. Tüm GStreamer eklentileri (aşağıdaki Android.mk dosyasından) bağlı olduğundan emin olun libgstreamer_android.so . GStreamer Version 1.18.3 ile en son konuşma SDK 'sını (1,16 ve üzeri) kullanırken, libc++_shared.so Android NDK 'den de bulunması gerekir.

GSTREAMER_PLUGINS := coreelements app audioconvert mpg123 \
    audioresample audioparsers ogg opusparse \
    opus wavparse alaw mulaw flac

Aşağıda bir örnek Android.mk ve Application.mk Dosya verilmiştir. Paylaşılan nesneyi oluşturmak için şu adımları izleyin gstreamer : 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

libgstreamer_android.soUbuntu 18,04 veya 20,04 ' de aşağıdaki komutu kullanarak oluşturabilirsiniz. Aşağıdaki komut satırları yalnızca ANDROID NDK b16b Ile GStreamer Android sürüm 1.14.4 için sınanmıştır.

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

Paylaşılan nesne () oluşturulduktan sonra libgstreamer_android.so Geliştirici, konuşma SDK 'sı tarafından yüklenebilmeleri için, paylaşılan nesneyi Android uygulamasına yerleştirmelidir.

Sıkıştırılmış ses işleme GStreamer kullanılarak uygulanır. Lisanslama nedenleriyle GStreamer ikili dosyaları derlenmiş ve Konuşma SDK'sı ile bağlantılı değildir. Geliştiricilerin çeşitli bağımlılıkları ve eklentileri yüklemesi gerekir. Bkz. Windows yükleme veya Linux'ta Yükleme. Konuşma SDK'sı çalışma zamanı sırasında ikili dosyaları yükleyebilirken GStreamer ikili dosyaları sistem yolunda olmalıdır. Örneğin, Windows sdk çalışma zamanı sırasında bulabilirse GStreamer ikili dosyaları sistem yolunda libgstreamer-1.0-0.dll demektir.

Konuşma SDK'sı sıkıştırılmış sesi işlemek için GStreamer kullanabilir. Ancak, lisanslama nedenleriyle GStreamer ikili dosyaları derlenmiş ve Konuşma SDK'sı ile bağlantılı değildir. Geliştiricilerin çeşitli bağımlılıkları ve eklentileri yüklemesi gerekir. Bkz. Linux'ta Yükleme. Go dili yalnızca Linux platformunda Konuşma SDK'sında de kullanılabilir. Go'da Microsoft Konuşma SDK'sı ile çalışmaya başlama için bkz. Go için Konuşma SDK'sı.

Codec ile sıkıştırılmış ses girişini kullanan örnek kod

Konuşma SDK 'sını sıkıştırılmış ses girişini kabul edecek şekilde yapılandırmak için, PullAudioInputStream veya oluşturun PushAudioInputStream . Daha sonra akış AudioConfig sınıfınızın bir örneğinden oluşturun ve akışın sıkıştırma biçimini belirtin. Konuşma SDK 'sı ses giriş akışı API 'Si hakkındabölümünde ilgili örnek kod parçacıklarını bulun.

Adlandırılmış bir giriş akışı sınıfınız olduğunu pullStream ve Opus/OGG kullandığınızı varsayalım. Kodunuz şöyle görünebilir:

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;

Konuşma SDK 'sını sıkıştırılmış ses girişini kabul edecek şekilde yapılandırmak için, PullAudioInputStream veya oluşturun PushAudioInputStream . Daha sonra akış AudioConfig sınıfınızın bir örneğinden oluşturun ve akışın sıkıştırma biçimini belirtin. Konuşma SDK örnekleribölümünde ilgili örnek kodu bulun.

Adlandırılmış bir giriş akışı sınıfınız olduğunu pushStream ve Opus/OGG kullandığınızı varsayalım. Kodunuz şöyle görünebilir:

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;

Konuşma SDK 'sını sıkıştırılmış ses girişini kabul edecek şekilde yapılandırmak için, PullAudioInputStream veya oluşturun PushAudioInputStream . Daha sonra akış AudioConfig sınıfınızın bir örneğinden oluşturun ve akışın sıkıştırma biçimini belirtin. Konuşma SDK örnekleribölümünde ilgili örnek kodu bulun.

Adlandırılmış bir giriş akışı sınıfınız olduğunu pullStream ve Opus/OGG kullandığınızı varsayalım. Kodunuz şöyle görünebilir:

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

Konuşma SDK 'sını sıkıştırılmış ses girişini kabul edecek şekilde yapılandırmak için, PullAudioInputStream veya oluşturun PushAudioInputStream . Daha sonra akış AudioConfig sınıfınızın bir örneğinden oluşturun ve akışın sıkıştırma biçimini belirtin.

Kullanım durumunun PullStream bir dosya için kullanılacağı varsayıyoruz MP3 . Kodunuz şöyle görünebilir:


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)

Konuşma SDK 'sını sıkıştırılmış ses girişini kabul edecek şekilde yapılandırmak için, PullAudioInputStream veya oluşturun PushAudioInputStream . Daha sonra akış AudioConfig sınıfınızın bir örneğinden oluşturun ve akışın sıkıştırma biçimini belirtin.

Aşağıdaki örnekte, kullanım durumunun PushStream Sıkıştırılmış bir dosya için kullanılacağı varsayılmaktadır.


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

Sonraki adımlar