From 28ccfbfc51068a663a80764e14074df5edf2b5ba Mon Sep 17 00:00:00 2001
From: kongdeqiang <kongdeqiang960204@163.com>
Date: 星期五, 13 三月 2026 17:41:41 +0800
Subject: [PATCH] 提交
---
runtime/python/websocket/funasr_client_api.py | 203 ++++++++++++++++++++++++++++----------------------
1 files changed, 114 insertions(+), 89 deletions(-)
diff --git a/runtime/python/websocket/funasr_client_api.py b/runtime/python/websocket/funasr_client_api.py
index d0992ff..3fa2422 100644
--- a/runtime/python/websocket/funasr_client_api.py
+++ b/runtime/python/websocket/funasr_client_api.py
@@ -1,11 +1,12 @@
-'''
+"""
Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
Reserved. MIT License (https://opensource.org/licenses/MIT)
2022-2023 by zhaomingwork@qq.com
-'''
+"""
+
# pip install websocket-client
-import ssl
+import ssl
from websocket import ABNF
from websocket import create_connection
from queue import Queue
@@ -14,122 +15,146 @@
import json
import time
import numpy as np
+
+
# class for recognizer in websocket
-class Funasr_websocket_recognizer():
- '''
+class Funasr_websocket_recognizer:
+ """
python asr recognizer lib
- '''
- def __init__(self, host="127.0.0.1", port="30035", is_ssl=True,chunk_size="5, 10, 5",chunk_interval=10,mode="offline",wav_name="default"):
- '''
- host: server host ip
- port: server port
- is_ssl: True for wss protocal, False for ws
- '''
- try:
- if is_ssl == True:
- ssl_context = ssl.SSLContext()
- ssl_context.check_hostname = False
- ssl_context.verify_mode = ssl.CERT_NONE
- uri = "wss://{}:{}".format(host, port)
- ssl_opt={"cert_reqs": ssl.CERT_NONE}
- else:
- uri = "ws://{}:{}".format(host, port)
- ssl_context = None
- ssl_opt=None
- self.host = host
- self.port = port
-
- self.msg_queue = Queue() # used for recognized result text
+ """
- print("connect to url",uri)
- self.websocket=create_connection(uri,ssl=ssl_context,sslopt=ssl_opt)
-
- self.thread_msg = threading.Thread(target=Funasr_websocket_recognizer.thread_rec_msg,args=(self,))
- self.thread_msg.start()
- chunk_size = [int(x) for x in chunk_size.split(",")]
- stride = int(60 * chunk_size[1]/ chunk_interval / 1000 * 16000 * 2)
- chunk_num = (len(audio_bytes) - 1) // stride + 1
-
- message = json.dumps({"mode": args.mode, "chunk_size": args.chunk_size, "encoder_chunk_look_back": 4,
- "decoder_chunk_look_back": 1, "chunk_interval": args.chunk_interval,
- "wav_name": wav_name, "is_speaking": True})
-
- self.websocket.send(message)
-
- print("send json",message)
-
- except Exception as e:
+ def __init__(
+ self,
+ host="127.0.0.1",
+ port="30035",
+ is_ssl=True,
+ chunk_size="0, 10, 5",
+ chunk_interval=10,
+ mode="offline",
+ wav_name="default",
+ ):
+ """
+ host: server host ip
+ port: server port
+ is_ssl: True for wss protocal, False for ws
+ """
+ try:
+ if is_ssl == True:
+ ssl_context = ssl.SSLContext()
+ ssl_context.check_hostname = False
+ ssl_context.verify_mode = ssl.CERT_NONE
+ uri = "wss://{}:{}".format(host, port)
+ ssl_opt = {"cert_reqs": ssl.CERT_NONE}
+ else:
+ uri = "ws://{}:{}".format(host, port)
+ ssl_context = None
+ ssl_opt = None
+ self.host = host
+ self.port = port
+
+ self.msg_queue = Queue() # used for recognized result text
+
+ print("connect to url", uri)
+ self.websocket = create_connection(uri, ssl=ssl_context, sslopt=ssl_opt)
+
+ self.thread_msg = threading.Thread(
+ target=Funasr_websocket_recognizer.thread_rec_msg, args=(self,)
+ )
+ self.thread_msg.start()
+ chunk_size = [int(x) for x in chunk_size.split(",")]
+ stride = int(60 * chunk_size[1] / chunk_interval / 1000 * 16000 * 2)
+ chunk_num = (len(audio_bytes) - 1) // stride + 1
+
+ message = json.dumps(
+ {
+ "mode": mode,
+ "chunk_size": chunk_size,
+ "encoder_chunk_look_back": 4,
+ "decoder_chunk_look_back": 1,
+ "chunk_interval": chunk_interval,
+ "wav_name": wav_name,
+ "is_speaking": True,
+ }
+ )
+
+ self.websocket.send(message)
+
+ print("send json", message)
+
+ except Exception as e:
print("Exception:", e)
traceback.print_exc()
-
+
# threads for rev msg
def thread_rec_msg(self):
try:
- while(True):
- msg=self.websocket.recv()
- if msg is None or len(msg)==0:
- continue
- msg = json.loads(msg)
-
- self.msg_queue.put(msg)
+ while True:
+ msg = self.websocket.recv()
+ if msg is None or len(msg) == 0:
+ continue
+ msg = json.loads(msg)
+
+ self.msg_queue.put(msg)
except Exception as e:
print("client closed")
-
+
# feed data to asr engine, wait_time means waiting for result until time out
- def feed_chunk(self, chunk,wait_time=0.01):
+ def feed_chunk(self, chunk, wait_time=0.01):
try:
- self.websocket.send(chunk, ABNF.OPCODE_BINARY)
+ self.websocket.send(chunk, ABNF.OPCODE_BINARY)
# loop to check if there is a message, timeout in 0.01s
- while(True):
- msg = self.msg_queue.get(timeout=wait_time)
- if self.msg_queue.empty():
- break
-
+ while True:
+ msg = self.msg_queue.get(timeout=wait_time)
+ if self.msg_queue.empty():
+ break
+
return msg
except:
return ""
- def close(self,timeout=1):
+
+ def close(self, timeout=1):
message = json.dumps({"is_speaking": False})
self.websocket.send(message)
# sleep for timeout seconds to wait for result
time.sleep(timeout)
- msg=""
- while(not self.msg_queue.empty()):
+ msg = ""
+ while not self.msg_queue.empty():
msg = self.msg_queue.get()
-
+
self.websocket.close()
# only resturn the last msg
return msg
-
-if __name__ == '__main__':
- print('example for Funasr_websocket_recognizer')
+
+
+if __name__ == "__main__":
+
+ print("example for Funasr_websocket_recognizer")
import wave
- wav_path="asr_example.wav"
+
+ wav_path = "/Users/zhifu/Downloads/modelscope_models/speech_seaco_paraformer_large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/example/asr_example.wav"
with wave.open(wav_path, "rb") as wav_file:
- params = wav_file.getparams()
- frames = wav_file.readframes(wav_file.getnframes())
- audio_bytes = bytes(frames)
-
-
+ params = wav_file.getparams()
+ frames = wav_file.readframes(wav_file.getnframes())
+ audio_bytes = bytes(frames)
+
stride = int(60 * 10 / 10 / 1000 * 16000 * 2)
chunk_num = (len(audio_bytes) - 1) // stride + 1
- # create an recognizer
- rcg=Funasr_websocket_recognizer(host="127.0.0.1",port="30035",is_ssl=True,mode="2pass")
+ # create an recognizer
+ rcg = Funasr_websocket_recognizer(
+ host="127.0.0.1", port="10095", is_ssl=True, mode="2pass", chunk_size="0,10,5"
+ )
# loop to send chunk
for i in range(chunk_num):
- beg = i * stride
- data = audio_bytes[beg:beg + stride]
-
- text=rcg.feed_chunk(data,wait_time=0.02)
- if len(text)>0:
- print("text",text)
- time.sleep(0.05)
-
+ beg = i * stride
+ data = audio_bytes[beg : beg + stride]
+
+ text = rcg.feed_chunk(data, wait_time=0.02)
+ if len(text) > 0:
+ print("text", text)
+ time.sleep(0.05)
+
# get last message
- text=rcg.close(timeout=3)
- print("text",text)
-
-
-
+ text = rcg.close(timeout=3)
+ print("text", text)
--
Gitblit v1.9.1