From f03a604204bbe0c79e53b01237a37e88683938c6 Mon Sep 17 00:00:00 2001
From: zhifu gao <zhifu.gzf@alibaba-inc.com>
Date: 星期六, 13 五月 2023 00:17:32 +0800
Subject: [PATCH] Merge pull request #505 from zhaomingwork/cpp-python-websocket-compatible

---
 funasr/runtime/python/websocket/ws_server_online.py |   41 +++++++++++++++++++++++++++--------------
 1 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/funasr/runtime/python/websocket/ws_server_online.py b/funasr/runtime/python/websocket/ws_server_online.py
index 3c0fb16..44edf98 100644
--- a/funasr/runtime/python/websocket/ws_server_online.py
+++ b/funasr/runtime/python/websocket/ws_server_online.py
@@ -41,25 +41,37 @@
     global websocket_users
     websocket_users.add(websocket)
     websocket.param_dict_asr_online = {"cache": dict()}
-
+    print("new user connected",flush=True)
     try:
         async for message in websocket:
-            message = json.loads(message)
-            is_finished = message["is_finished"]
-            if not is_finished:
-                audio = bytes(message['audio'], 'ISO-8859-1')
-
-                is_speaking = message["is_speaking"]
-                websocket.param_dict_asr_online["is_final"] = not is_speaking
-                websocket.wav_name = message.get("wav_name", "demo")
-                websocket.param_dict_asr_online["chunk_size"] = message["chunk_size"]
-                
-                frames_asr_online.append(audio)
-                if len(frames_asr_online) % message["chunk_interval"] == 0 or not is_speaking:
+            
+ 
+            if isinstance(message,str):
+              messagejson = json.loads(message)
+               
+              if "is_speaking" in messagejson:
+                  websocket.is_speaking = messagejson["is_speaking"]  
+                  websocket.param_dict_asr_online["is_final"] = not websocket.is_speaking
+              if "is_finished" in messagejson:
+                  websocket.is_speaking = False
+                  websocket.param_dict_asr_online["is_final"] = True
+              if "chunk_interval" in messagejson:
+                  websocket.chunk_interval=messagejson["chunk_interval"]
+              if "wav_name" in messagejson:
+                  websocket.wav_name = messagejson.get("wav_name", "demo")
+              if "chunk_size" in messagejson:
+                  websocket.param_dict_asr_online["chunk_size"] = messagejson["chunk_size"]
+            # if has bytes in buffer or message is bytes
+            if len(frames_asr_online)>0 or not isinstance(message,str):
+               if not isinstance(message,str):
+                 frames_asr_online.append(message)
+               if len(frames_asr_online) % websocket.chunk_interval == 0 or not websocket.is_speaking:
                     audio_in = b"".join(frames_asr_online)
+                    if not websocket.is_speaking:
+                       #padding 0.5s at end gurantee that asr engine can fire out last word
+                       audio_in=audio_in+b''.join(np.zeros(int(16000*0.5),dtype=np.int16))
                     await async_asr_online(websocket,audio_in)
                     frames_asr_online = []
-
 
      
     except websockets.ConnectionClosed:
@@ -69,6 +81,7 @@
         print("InvalidState...")
     except Exception as e:
         print("Exception:", e)
+
  
 async def async_asr_online(websocket,audio_in):
             if len(audio_in) > 0:

--
Gitblit v1.9.1