olivebot/test/funasr/ASR_client.py
xszyou 524e4d0e65 提供funasr集成
1、修正语音和文字的交互逻辑;
2、提供funasr的可选集成。
2023-05-17 18:38:47 +08:00

95 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pyaudio
import websockets
import asyncio
from queue import Queue
import argparse
import json
parser = argparse.ArgumentParser()
parser.add_argument("--host",
type=str,
default="172.16.77.144",
required=False,
help="host ip, localhost, 0.0.0.0")
parser.add_argument("--port",
type=int,
default=10194,
required=False,
help="grpc server port")
parser.add_argument("--chunk_size",
type=int,
default=160,
help="ms")
parser.add_argument("--vad_needed",
type=bool,
default=True)
args = parser.parse_args()
voices = Queue()
async def record():
global voices
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
CHUNK = int(RATE / 1000 * args.chunk_size)
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
while True:
data = stream.read(CHUNK)
voices.put(data)
await asyncio.sleep(0.01)
async def ws_send():
global voices
global websocket
print("started to sending data!")
#设置传入参数是否需要vad
data_head = {
'vad_need': args.vad_needed,
'state': ''
}
if type(data_head) == dict:
await websocket.send(json.dumps(data_head))
while True:
while not voices.empty():
data = voices.get()
voices.task_done()
try:
if type(data) == bytes:
await websocket.send(data) # 通过ws对象发送数据
except Exception as e:
print('Exception occurred:', e)
await asyncio.sleep(0.01)
await asyncio.sleep(0.01)
async def message():
global websocket
while True:
try:
print(await websocket.recv())
except Exception as e:
print("Exception:", e)
async def ws_client():
global websocket # 定义一个全局变量ws用于保存websocket连接对象
# uri = "ws://11.167.134.197:8899"
uri = "ws://{}:{}".format(args.host, args.port)
async for websocket in websockets.connect(uri, subprotocols=["binary"], ping_interval=None):
task1 = asyncio.create_task(record()) # 创建一个后台任务录音
task2 = asyncio.create_task(ws_send()) # 创建一个后台任务发送
task3 = asyncio.create_task(message()) # 创建一个后台接收消息的任务
await asyncio.gather(task1, task2, task3)
asyncio.get_event_loop().run_until_complete(ws_client()) # 启动协程
asyncio.get_event_loop().run_forever()