Невозможно получить результаты преобразования текста в речь Google при потоковой передаче аудио из Интернета.

Я хочу транслировать аудио из Интернета и преобразовывать его в текст с помощью Python Google-cloud-speech API. Я интегрировал это в свой код каналов Django.

Для интерфейса я напрямую скопировал этот code, и этот код есть в бэкенде (см. ниже). Теперь, что касается проблемы, я не получаю никаких исключений или ошибок, но я не получал никаких результатов от API Google.

Что я пробовал:

  • Я помещаю точки отладки внутри цикла for функции process, управление никогда не попадает внутрь цикла.

  • Я просмотрел код Java здесь и пытался это понять. У меня есть настройка этого java-кода на моем локальном компьютере и его отладка. Я понял одну вещь: в java-коде метод onWebSocketBinary получает целочисленный массив, из внешнего интерфейса мы отправляем его вот так.

      socket.send(Int16Array.from(floatSamples.map(function (n) {return n * MAX_INT;})));
    
  • В java они конвертируются в байтовую строку, а затем отправляются в Google. Тогда как в Django я поставил точки отладки и заметил, что получаю данные в двоичной строке. Так что я чувствовал, что мне не нужно ничего делать с этим. но я попробовал несколько способов, преобразовав это в целочисленный массив, но это не сработало, потому что Google ожидает в байтах (вы можете увидеть прокомментированный код ниже).

  • Я просмотрел этот пример кода и это от Google и я делаю то же самое, я не понял, что я делаю здесь неправильно.

Код Джанго:

import json

from channels.generic.websocket import WebsocketConsumer

# Imports the Google Cloud client library
from google.cloud import speech
from google.cloud.speech import enums
from google.cloud.speech import types

# Instantiates a client
client = speech.SpeechClient()
language_code = "en-US"
streaming_config = None


class SpeechToTextConsumer(WebsocketConsumer):
    def connect(self):
        self.accept()

    def disconnect(self, close_code):
        pass

    def process(self, streaming_recognize_response: types.StreamingRecognitionResult):
        for response in streaming_recognize_response:
            if not response.results:
                continue
            result = response.results[0]
            self.send(text_data=json.dumps(result))

    def receive(self, text_data=None, bytes_data=None):
        global streaming_config
        if text_data:
            data = json.loads(text_data)
            rate = data["sampleRate"]
            config = types.RecognitionConfig(
                encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
                sample_rate_hertz=rate,
                language_code=language_code,
            )
            streaming_config = types.StreamingRecognitionConfig(
                config=config, interim_results=True, single_utterance=False
            )
            types.StreamingRecognizeRequest(streaming_config=streaming_config)
            self.send(text_data=json.dumps({"message": "processing..."}))
        if bytes_data:
            # bytes_data = bytes_data[math.floor(len(bytes_data) / 2) :]
            # bytes_data = bytes_data.lstrip(b"\x00")
            # bytes_data = int.from_bytes(bytes_data, "little")
            stream = [bytes_data]
            requests = (
                types.StreamingRecognizeRequest(audio_content=chunk) for chunk in stream
            )
            responses = client.streaming_recognize(streaming_config, requests)
            self.process(responses)

person Lokesh Sanapalli    schedule 09.05.2019    source источник
comment
для вас важно также опубликовать код на стороне сервера, который получает запросы веб-сокета... минимальный полный пример как на стороне сервера, так и на стороне клиента будет мотивировать больше людей протянуть руку... я создал такого зверя, это не так уж сложно   -  person Scott Stensland    schedule 14.05.2019
comment
@ScottStensland спасибо за помощь, внутренний код в значительной степени работает нормально ... с этим нет проблем ... Мне просто нужно знать, как транслировать аудио, вот и все ....   -  person Lokesh Sanapalli    schedule 15.05.2019
comment
Как вы тестировали бэкенд-код? Это работало с вашим голосовым потоком?   -  person Ali Asgari    schedule 24.10.2019
comment
@Lokesh Sanapalli, ты когда-нибудь находил решение для этого?   -  person Mišel Ademi    schedule 25.10.2020
comment
@MišelAdemi Нет, все еще жду   -  person Lokesh Sanapalli    schedule 28.10.2020


Ответы (1)


Я столкнулся с похожей проблемой при создании виртуального помощника с искусственным интеллектом и считаю, что могу предложить хоть немного помощи. Я никоим образом не эксперт, но я нашел способ реализовать механизм преобразования текста в речь Google. Я использовал библиотеку python voice_recognition (вы можете скачать ее с помощью pip install speech_recognition) и импортировал ее как sr. отсюда вы настраиваете API Google с помощью распознать.recognize_google (аудиофайл). Вам не нужна учетная запись, так как эта библиотека уже включает в себя ключ, и ее очень легко настроить и внедрить где угодно (например, в Django). Вот очень полезная ссылка на учебник по этому вопросу, который я действительно рекомендую. Вот ссылка на документацию. Вот полезная программа, которая берет аудиофайл и расшифровывает используя все доступные сервисы распознавания речи. Это код ниже, вы можете использовать любой сервис, который вам нравится, sphinx работает в автономном режиме, а API Google не требует регистрации, поскольку у него уже есть ключ и пароль.

    #!/usr/bin/env python3

import speech_recognition as sr

# obtain path to "english.wav" in the same folder as this script
from os import path
AUDIO_FILE = path.join(path.dirname(path.realpath(__file__)), "english.wav")
# AUDIO_FILE = path.join(path.dirname(path.realpath(__file__)), "french.aiff")
# AUDIO_FILE = path.join(path.dirname(path.realpath(__file__)), "chinese.flac")

# use the audio file as the audio source
r = sr.Recognizer()
with sr.AudioFile(AUDIO_FILE) as source:
    audio = r.record(source)  # read the entire audio file

# recognize speech using Sphinx
try:
    print("Sphinx thinks you said " + r.recognize_sphinx(audio))
except sr.UnknownValueError:
    print("Sphinx could not understand audio")
except sr.RequestError as e:
    print("Sphinx error; {0}".format(e))

# recognize speech using Google Speech Recognition
try:
    # for testing purposes, we're just using the default API key
    # to use another API key, use `r.recognize_google(audio, key="GOOGLE_SPEECH_RECOGNITION_API_KEY")`
    # instead of `r.recognize_google(audio)`
    print("Google Speech Recognition thinks you said " + r.recognize_google(audio))
except sr.UnknownValueError:
    print("Google Speech Recognition could not understand audio")
except sr.RequestError as e:
    print("Could not request results from Google Speech Recognition service; {0}".format(e))

# recognize speech using Google Cloud Speech
GOOGLE_CLOUD_SPEECH_CREDENTIALS = r"""INSERT THE CONTENTS OF THE GOOGLE CLOUD SPEECH JSON CREDENTIALS FILE HERE"""
try:
    print("Google Cloud Speech thinks you said " + r.recognize_google_cloud(audio, credentials_json=GOOGLE_CLOUD_SPEECH_CREDENTIALS))
except sr.UnknownValueError:
    print("Google Cloud Speech could not understand audio")
except sr.RequestError as e:
    print("Could not request results from Google Cloud Speech service; {0}".format(e))

# recognize speech using Wit.ai
WIT_AI_KEY = "INSERT WIT.AI API KEY HERE"  # Wit.ai keys are 32-character uppercase alphanumeric strings
try:
    print("Wit.ai thinks you said " + r.recognize_wit(audio, key=WIT_AI_KEY))
except sr.UnknownValueError:
    print("Wit.ai could not understand audio")
except sr.RequestError as e:
    print("Could not request results from Wit.ai service; {0}".format(e))

# recognize speech using Microsoft Azure Speech
AZURE_SPEECH_KEY = "INSERT AZURE SPEECH API KEY HERE"  # Microsoft Speech API keys 32-character lowercase hexadecimal strings
try:
    print("Microsoft Azure Speech thinks you said " + r.recognize_azure(audio, key=AZURE_SPEECH_KEY))
except sr.UnknownValueError:
    print("Microsoft Azure Speech could not understand audio")
except sr.RequestError as e:
    print("Could not request results from Microsoft Azure Speech service; {0}".format(e))

# recognize speech using Microsoft Bing Voice Recognition
BING_KEY = "INSERT BING API KEY HERE"  # Microsoft Bing Voice Recognition API keys 32-character lowercase hexadecimal strings
try:
    print("Microsoft Bing Voice Recognition thinks you said " + r.recognize_bing(audio, key=BING_KEY))
except sr.UnknownValueError:
    print("Microsoft Bing Voice Recognition could not understand audio")
except sr.RequestError as e:
    print("Could not request results from Microsoft Bing Voice Recognition service; {0}".format(e))

# recognize speech using Houndify
HOUNDIFY_CLIENT_ID = "INSERT HOUNDIFY CLIENT ID HERE"  # Houndify client IDs are Base64-encoded strings
HOUNDIFY_CLIENT_KEY = "INSERT HOUNDIFY CLIENT KEY HERE"  # Houndify client keys are Base64-encoded strings
try:
    print("Houndify thinks you said " + r.recognize_houndify(audio, client_id=HOUNDIFY_CLIENT_ID, client_key=HOUNDIFY_CLIENT_KEY))
except sr.UnknownValueError:
    print("Houndify could not understand audio")
except sr.RequestError as e:
    print("Could not request results from Houndify service; {0}".format(e))

# recognize speech using IBM Speech to Text
IBM_USERNAME = "INSERT IBM SPEECH TO TEXT USERNAME HERE"  # IBM Speech to Text usernames are strings of the form XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
IBM_PASSWORD = "INSERT IBM SPEECH TO TEXT PASSWORD HERE"  # IBM Speech to Text passwords are mixed-case alphanumeric strings
try:
    print("IBM Speech to Text thinks you said " + r.recognize_ibm(audio, username=IBM_USERNAME, password=IBM_PASSWORD))
except sr.UnknownValueError:
    print("IBM Speech to Text could not understand audio")
except sr.RequestError as e:
    print("Could not request results from IBM Speech to Text service; {0}".format(e))

Надеюсь, это помогло в некотором роде!

person Mason Choi    schedule 26.02.2021