Watson ASR Python WebSocket - PullRequest
       64

Watson ASR Python WebSocket

0 голосов
/ 03 декабря 2018

Я использую Python Websockets, реализованные с использованием библиотеки websocket-client, для выполнения распознавания живой речи с использованием Watson ASR.Это решение работало до недавнего времени, но около месяца назад оно перестало работать.Нет даже рукопожатия.Как ни странно, я не изменил код (ниже).У другого коллеги, использующего другой аккаунт, такая же проблема, поэтому мы не считаем, что с нашими аккаунтами что-то не так.Я связался с IBM по этому поводу, но поскольку рукопожатия не было, они никак не могли отследить, если что-то не так с их стороны.Код для веб-сокета показан ниже.

import websocket
(...)
ws = websocket.WebSocketApp(
   self.api_url,
   header=headers,
   on_message=self.on_message,
   on_error=self.on_error,
   on_close=self.on_close,
   on_open=self.on_open
)

Если URL-адрес 'wss: //stream.watsonplatform.net/speech-to-text/api/v1/recognize', заголовки - это токены авторизации.и другие функции и методы для обработки обратных вызовов.В данный момент происходит то, что этот метод запускается и ждет, пока не истечет время ожидания соединения.Мне было интересно, возникает ли эта проблема с кем-либо еще, работающим вживую ASR с Watson в Python, работающим с этой библиотекой websocket-client.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

@ zedavid Более месяца назад мы перешли на использование IAM, поэтому username и password были заменены на IAM apikey.Вы должны перенести ваш экземпляр Cloud Foundry Speech to Text в IAM.Существует страница Миграция , которая поможет вам лучше понять это.Вы также можете создать новый экземпляр Speech to Text, который по умолчанию будет управляемым ресурсом экземпляром.

После того, как вы получите новый экземпляр, вам нужно будет получить access_token, который похож на token вОблако Литейное.access_token будет использоваться для авторизации вашего запроса.

Наконец, недавно мы выпустили поддержку Speech to Text и Text to Speech в Python SDK .Я рекомендую вам использовать это вместо написания кода для обмена токенами и управления соединениями WebSocket.

service = SpeechToTextV1(
    iam_apikey='YOUR APIKEY',
    url='https://stream.watsonplatform.net/speech-to-text/api')

# Example using websockets
class MyRecognizeCallback(RecognizeCallback):
    def __init__(self):
        RecognizeCallback.__init__(self)

    def on_transcription(self, transcript):
        print(transcript)

    def on_connected(self):
        print('Connection was successful')

    def on_error(self, error):
        print('Error received: {}'.format(error))

    def on_inactivity_timeout(self, error):
        print('Inactivity timeout: {}'.format(error))

    def on_listening(self):
        print('Service is listening')

    def on_hypothesis(self, hypothesis):
        print(hypothesis)

    def on_data(self, data):
        print(data)

# Example using threads in a non-blocking way
mycallback = MyRecognizeCallback()
audio_file = open(join(dirname(__file__), '../resources/speech.wav'), 'rb')
audio_source = AudioSource(audio_file)
recognize_thread = threading.Thread(
    target=service.recognize_using_websocket,
    args=(audio_source, "audio/l16; rate=44100", mycallback))
recognize_thread.start()
0 голосов
/ 04 декабря 2018

Спасибо за информацию заголовков.Вот как это работает для меня.

Я использую WebSocket-клиент 0.54.0, который в настоящее время является последней версией.Я сгенерировал токен, используя

curl -u <USERNAME>:<PASSWORD>  "https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api"

Используя полученный токен в приведенном ниже коде, я смог произвести рукопожатие

import websocket

try:
    import thread
except ImportError:
    import _thread as thread
import time
import json


def on_message(ws, message):
    print(message)


def on_error(ws, error):
    print(error)


def on_close(ws):
    print("### closed ###")

def on_open(ws):
    def run(*args):
        for i in range(3):
            time.sleep(1)
            ws.send("Hello %d" % i)
        time.sleep(1)
        ws.close()
        print("thread terminating...")

    thread.start_new_thread(run, ())


if __name__ == "__main__":
    # headers["Authorization"] = "Basic " + base64.b64encode(auth.encode()).decode('utf-8')
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize",
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close,
                                header={
                                    "X-Watson-Authorization-Token": <TOKEN>"})
    ws.on_open = on_open
    ws.run_forever()

Ответ:

--- request header ---
GET /speech-to-text/api/v1/recognize HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: stream.watsonplatform.net
Origin: http://stream.watsonplatform.net
Sec-WebSocket-Key: Yuack3TM04/MPePJzvH8bA==
Sec-WebSocket-Version: 13
X-Watson-Authorization-Token: <TOKEN>


-----------------------
--- response header ---
HTTP/1.1 101 Switching Protocols
Date: Tue, 04 Dec 2018 12:13:57 GMT
Content-Type: application/octet-stream
Connection: upgrade
Upgrade: websocket
Sec-Websocket-Accept: 4te/E4t9+T8pBtxabmxrvPZfPfI=
x-global-transaction-id: a83c91fd1d100ff0cb2a6f50a7690694
X-DP-Watson-Tran-ID: a83c91fd1d100ff0cb2a6f50a7690694
-----------------------
send: b'\x81\x87\x9fd\xd9\xae\xd7\x01\xb5\xc2\xf0D\xe9'
Connection is already closed.
### closed ###

Process finished with exit code 0

Согласно RFC 6455 сервер должен ответить протоколом 101 Switching,

Рукопожатие с сервера выглядит следующим образом:

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
    Sec-WebSocket-Protocol: chat

Кроме того, когда я использую ws:// вместо wss://, я сталкиваюсь с проблемой тайм-аута операции.

Обновление: Пример с распознаванием живой речи - https://github.com/watson-developer-cloud/python-sdk/blob/master/examples/microphone-speech-to-text.py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...