куски от javascript до байтов или поток с flask API - PullRequest
1 голос
/ 02 марта 2020

Я отправляю фрагменты аудиоданных из браузера javascript с помощью getUsermedia в flask python API для речи в текст. Первоначально я использовал для преобразования аудио фрагментов в blob, а затем использовал файловый подход для речевого текста. Теперь я хотел бы использовать поток вместо файла / блоб. Может ли кто-нибудь помочь на flask logi c для преобразования аудио фрагментов в поток или байты. Я получаю сообщение об ошибке «Не удается преобразовать список в байты» в flask API, когда я пытаюсь отправить чанки, как показано ниже, введите код здесь

Smaple loigc
chunks=[]
in ondataavilable(){
chunks.push(e.data)
}

1 Ответ

0 голосов
/ 03 марта 2020

Вы можете добавить что-то вроде chunk_id в запрос и затем объединить поток чанков вместе, но лучше использовать что-то вроде поддержки Websocket для потоковой передачи. Проверьте детали Воск-сервер код:

#!/usr/bin/env python3

import json
import os
import sys
import asyncio
import pathlib
import websockets
import concurrent.futures
from vosk import Model, KaldiRecognizer

vosk_interface = os.environ.get('VOSK_SERVER_INTERFACE', '0.0.0.0')
vosk_port = int(os.environ.get('VOSK_SERVER_PORT', 2700))
vosk_model_path = os.environ.get('VOSK_MODEL_PATH', 'model')

if len(sys.argv) > 1:
   vosk_model_path = sys.argv[1]

model = Model(vosk_model_path)
pool = concurrent.futures.ThreadPoolExecutor()
loop = asyncio.get_event_loop()

def process_chunk(rec, message):
    if message == '{"eof" : 1}':
        return rec.FinalResult(), True
    elif rec.AcceptWaveform(message):
        return rec.Result(), False
    else:
        return rec.PartialResult(), False

async def recognize(websocket, path):

    rec = None
    word_list = None
    sample_rate = 8000.0

    while True:

        message = await websocket.recv()

        # Load configuration if provided
        if isinstance(message, str) and 'config' in message:
            jobj = json.loads(message)['config']
            if 'word_list' in jobj:
                word_list = jobj['word_list']
            if 'sample_rate' in jobj:
                sample_rate = float(jobj['sample_rate'])
            continue

        # Create the recognizer, word list is temporary disabled since not every model supports it
        if not rec:
            if False and word_list:
                 rec = KaldiRecognizer(model, sample_rate, word_list)
            else:
                 rec = KaldiRecognizer(model, sample_rate)

        response, stop = await loop.run_in_executor(pool, process_chunk, rec, message)
        await websocket.send(response)
        if stop: break

start_server = websockets.serve(
    recognize, vosk_interface, vosk_port)

loop.run_until_complete(start_server)
loop.run_forever()

Для примера клиента проверьте angular demo .

...