STT Watson Python «Получена ошибка: [WinError 10014] Система обнаружила неверный адрес указателя при попытке использовать аргумент указателя в вызове» - PullRequest
0 голосов
/ 18 октября 2018

Недавно я попытался создать программу, которая может превращать живой аудиопоток в текст и искать его по ключевому слову.Затем я хотел бы активировать другую функцию прослушивания.Мой текущий код выглядит следующим образом (без второй функции прослушивания):

from __future__ import print_function
import json
from os.path import join, dirname
from watson_developer_cloud import SpeechToTextV1
from watson_developer_cloud.websocket import RecognizeCallback, AudioSource
import threading

# If service instance provides API key authentication
# service = SpeechToTextV1(
#     ## url is optional, and defaults to the URL below. Use the correct URL for your region.
url='https://stream.watsonplatform.net/speech-to-text/api',
#     iam_apikey='your_apikey')

service = SpeechToTextV1(
    username='MY USERNAME',
    password='MY PASSWORD',
    url='https://stream.watsonplatform.net/speech-to-text/api')
"""
models = service.list_models().get_result()
print(json.dumps(models, indent=2))

model = service.get_model('en-US_BroadbandModel').get_result()
print(json.dumps(model, indent=2))

with open(join(dirname(__file__), 'audio-file.flac'),
          'rb') as audio_file:
    print(json.dumps(
        service.recognize(
            audio=audio_file,
            content_type='audio/flac',
            timestamps=True,
            word_confidence=True).get_result(),
        indent=2))
`"""
# 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__), 'audio-file.flac'), 'rb')
audio_source = AudioSource(audio_file)
recognize_thread = threading.Thread(
    target=service.recognize_using_websocket,
    args=(audio_source, "audio/wav; rate=44100", mycallback))
recognize_thread.start()

Этот код в настоящее время возвращает следующую ошибку:

Error received: unable to transcode data stream audio/wav -> audio/x-float-array 
Error received: 'NoneType' object has no attribute 'connected'

В приложении есть все, что вернул Python:

Screenshot of errors

В настоящее время я использую 64-разрядные Windows 10 с Python 3.4.2

РЕДАКТИРОВАТЬ:

Сообщение об ошибкетеперь, похоже, изменилось на следующее:

Error received: unable to transcode data stream audio/wav -> audio/x-float-array 
Error received: [WinError 10014] The system detected an invalid pointer address in attempting to use a pointer argument in a call

1 Ответ

0 голосов
/ 23 марта 2019

РЕДАКТИРОВАТЬ: ваш сценарий не работает, потому что вы смешиваете аудио / WAV с аудио / FLAC.Они имеют разные форматы и не являются взаимозаменяемыми.

Использование этого кода будет работать, хотя я не тестировал его запуск через поток.

with open("audio-file.flac", "rb") as audio_file:
    audio_source = AudioSource(audio_file)
    print("Sending file to Watson...")
    stt_auth.recognize_using_websocket( 
        audio=audio_source, 
        content_type="audio/flac", 
        recognize_callback=mycallback,
        interim_results=True, # Print all attempts, including not final responses.
    )

Я бы попытался настроить поток с именем файла в качестве аргумента.Обратите внимание, что я сам не проверял это, но оно должно работать.

def play_audiofile(name):
    with open("audio-file.flac", "rb") as audio_file:
        audio_source = AudioSource(audio_file)
        print("Sending file to Watson...")
        stt_auth.recognize_using_websocket( 
            audio=audio_source, 
            content_type="audio/flac", 
            recognize_callback=mycallback,
            interim_results=True, # Print all attempts, including not final responses.
        )

play_file_in_background = Thread(target=play_audiofile, args="audio-file.flac")
play_file_in_background.start()

while play_file_in_background.isAlive():
    pass  # Don't end until it has finished
...