95 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			95 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | 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() |