update the audio handler note, test=doc

pull/1761/head
xiongxinlei 3 years ago
parent 7aa5a3df2b
commit 2f2cb7eaaf

@ -1,23 +1,48 @@
import numpy as np # Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
import logging #
import argparse # Licensed under the Apache License, Version 2.0 (the "License");
import asyncio # you may not use this file except in compliance with the License.
import codecs # You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json import json
import logging import logging
import os
import numpy as np import numpy as np
import soundfile import soundfile
import websockets import websockets
from paddlespeech.cli.log import logger from paddlespeech.cli.log import logger
class ASRAudioHandler: class ASRAudioHandler:
def __init__(self, url="127.0.0.1", port=8090): def __init__(self, url="127.0.0.1", port=8090):
"""PaddleSpeech Online ASR Server Client audio handler
Online asr server use the websocket protocal
Args:
url (str, optional): the server ip. Defaults to "127.0.0.1".
port (int, optional): the server port. Defaults to 8090.
"""
self.url = url self.url = url
self.port = port self.port = port
self.url = "ws://" + self.url + ":" + str(self.port) + "/ws/asr" self.url = "ws://" + self.url + ":" + str(self.port) + "/ws/asr"
def read_wave(self, wavfile_path: str): def read_wave(self, wavfile_path: str):
"""read the audio file from specific wavfile path
Args:
wavfile_path (str): the audio wavfile,
we assume that audio sample rate matches the model
Yields:
numpy.array: the samall package audio pcm data
"""
samples, sample_rate = soundfile.read(wavfile_path, dtype='int16') samples, sample_rate = soundfile.read(wavfile_path, dtype='int16')
x_len = len(samples) x_len = len(samples)
@ -40,11 +65,19 @@ class ASRAudioHandler:
yield x_chunk yield x_chunk
async def run(self, wavfile_path: str): async def run(self, wavfile_path: str):
"""Send a audio file to online server
Args:
wavfile_path (str): audio path
Returns:
str: the final asr result
"""
logging.info("send a message to the server") logging.info("send a message to the server")
# self.read_wave()
# send websocket handshake protocal # 1. send websocket handshake protocal
async with websockets.connect(self.url) as ws: async with websockets.connect(self.url) as ws:
# server has already received handshake protocal # 2. server has already received handshake protocal
# client start to send the command # client start to send the command
audio_info = json.dumps( audio_info = json.dumps(
{ {
@ -59,14 +92,14 @@ class ASRAudioHandler:
msg = await ws.recv() msg = await ws.recv()
logger.info("receive msg={}".format(msg)) logger.info("receive msg={}".format(msg))
# send chunk audio data to engine # 3. send chunk audio data to engine
for chunk_data in self.read_wave(wavfile_path): for chunk_data in self.read_wave(wavfile_path):
await ws.send(chunk_data.tobytes()) await ws.send(chunk_data.tobytes())
msg = await ws.recv() msg = await ws.recv()
msg = json.loads(msg) msg = json.loads(msg)
logger.info("receive msg={}".format(msg)) logger.info("receive msg={}".format(msg))
# finished # 4. we must send finished signal to the server
audio_info = json.dumps( audio_info = json.dumps(
{ {
"name": "test.wav", "name": "test.wav",
@ -79,7 +112,7 @@ class ASRAudioHandler:
await ws.send(audio_info) await ws.send(audio_info)
msg = await ws.recv() msg = await ws.recv()
# decode the bytes to str # 5. decode the bytes to str
msg = json.loads(msg) msg = json.loads(msg)
logger.info("final receive msg={}".format(msg)) logger.info("final receive msg={}".format(msg))
result = msg result = msg

Loading…
Cancel
Save