grpc_main_client.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. '''
  2. Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
  3. Reserved. MIT License (https://opensource.org/licenses/MIT)
  4. 2023 by burkliu(刘柏基) liubaiji@xverse.cn
  5. '''
  6. import logging
  7. import argparse
  8. import soundfile as sf
  9. import time
  10. import grpc
  11. import paraformer_pb2_grpc
  12. from paraformer_pb2 import Request, WavFormat, DecodeMode
  13. class GrpcClient:
  14. def __init__(self, wav_path, uri, mode):
  15. self.wav, self.sampling_rate = sf.read(wav_path, dtype='int16')
  16. self.wav_format = WavFormat.pcm
  17. self.audio_chunk_duration = 1000 # ms
  18. self.audio_chunk_size = int(self.sampling_rate * self.audio_chunk_duration / 1000)
  19. self.send_interval = 100 # ms
  20. self.mode = mode
  21. # connect to grpc server
  22. channel = grpc.insecure_channel(uri)
  23. self.stub = paraformer_pb2_grpc.ASRStub(channel)
  24. # start request
  25. for respond in self.stub.Recognize(self.request_iterator()):
  26. logging.info("[receive] mode {}, text {}, is final {}".format(
  27. DecodeMode.Name(respond.mode), respond.text, respond.is_final))
  28. def request_iterator(self, mode = DecodeMode.two_pass):
  29. is_first_pack = True
  30. is_final = False
  31. for start in range(0, len(self.wav), self.audio_chunk_size):
  32. request = Request()
  33. audio_chunk = self.wav[start : start + self.audio_chunk_size]
  34. if is_first_pack:
  35. is_first_pack = False
  36. request.sampling_rate = self.sampling_rate
  37. request.mode = self.mode
  38. request.wav_format = self.wav_format
  39. if request.mode == DecodeMode.two_pass or request.mode == DecodeMode.online:
  40. request.chunk_size.extend([5, 10, 5])
  41. if start + self.audio_chunk_size >= len(self.wav):
  42. is_final = True
  43. request.is_final = is_final
  44. request.audio_data = audio_chunk.tobytes()
  45. logging.info("[request] audio_data len {}, is final {}".format(
  46. len(request.audio_data), request.is_final)) # int16 = 2bytes
  47. time.sleep(self.send_interval / 1000)
  48. yield request
  49. if __name__ == '__main__':
  50. logging.basicConfig(filename="", format="%(asctime)s %(message)s", level=logging.INFO)
  51. parser = argparse.ArgumentParser()
  52. parser.add_argument("--host",
  53. type=str,
  54. default="127.0.0.1",
  55. required=False,
  56. help="grpc server host ip")
  57. parser.add_argument("--port",
  58. type=int,
  59. default=10100,
  60. required=False,
  61. help="grpc server port")
  62. parser.add_argument("--wav_path",
  63. type=str,
  64. required=True,
  65. help="audio wav path")
  66. args = parser.parse_args()
  67. for mode in [DecodeMode.offline, DecodeMode.online, DecodeMode.two_pass]:
  68. mode_name = DecodeMode.Name(mode)
  69. logging.info("[request] start requesting with mode {}".format(mode_name))
  70. st = time.time()
  71. uri = '{}:{}'.format(args.host, args.port)
  72. client = GrpcClient(args.wav_path, uri, mode)
  73. logging.info("mode {}, time pass: {}".format(mode_name, time.time() - st))