wenet-e2e / wenet

Production First and Production Ready End-to-End Speech Recognition Toolkit
https://wenet-e2e.github.io/wenet/
Apache License 2.0
4.12k stars 1.07k forks source link

请教一下关于gRPC部署流式WeNet模型的问题 #505

Closed yjiangling closed 3 years ago

yjiangling commented 3 years ago

博主你好,

   看了一下“基于 WeNet 和 gRPC 的语音识别微服务架构的设计和应用”,有几个问题实在看不懂,想请教你们一下。
  1. 流式请求的Request是DecodeConfig/bytes中的一种(oneof关键字),其中DecodeConfig包含nbest_config/continuous_decoding_config两个字段,分别为int/bool类型

message Request { message DecodeConfig { int32 nbest_config = 1; bool continuous_decoding_config = 2; } oneof RequestPayload { DecodeConfig decode_config = 1; bytes audio_data = 2; } }

这个bytes 好理解,是音频的字节流,但是这个decode_config是什么参数呢?控制模型解码的参数吗?nbest_config表示返回最大概率的beam的数量?continuous_decoding_config是控制什么的呢?但是模型不是在请求发起时就做了初始化吗?还是说第一个请求必须是DecodeConfig?服务收到这个请求才开始做模型初始化?

  1. 流式请求的Response含status/type/nbest三个字段,其中status/type为枚举类型,说明它们的赋值必须为范围内的一种。nbest为repeated OneBest类型,OneBest则由sentence和wordpieces字段组成

message Response { message OneBest { string sentence = 1; repeated OnePiece wordpieces = 2; } message OnePiece { string word = 1; int32 start = 2; int32 end = 3; } enum Status { ok = 0; failed = 1; } enum Type { server_ready = 0; partial_result = 1; final_result = 2; speech_end = 3; } Status status = 1; Type type = 2; repeated OneBest nbest = 3; }

然后Response字段中,Status是返回模型初始化的结果吗?那这个Type字段中的server_ready又是返回什么信息呢?partial_result和final_result是根据是否解码出结束符给定吗?那怎么又有一个speech_end呢?这个又是返回什么信息呢?OnePiece字段中的start和end又是返回的是什么信息呢?

  1. 最后一个问题是怎么处理流式解码过程中的cache的?比如在送入一个chunk的请求数据流后,模型推理完encoder端每一层MHA都会生成cache(或者叫memory),这部分cache是怎么保存下来的?当下一个chunk的数据流发送过来后,怎么调用这部分的cache去做下一个chunk的推理?

不好意思,问题稍微有点多,求解答,麻烦你们了,谢谢!

robin1001 commented 3 years ago

Have you tried to read the source code? the first two questions are about speech application, the last is about implementation details. If you want to learn all the details, please first read all our docs, then read some source code related to your question.

robin1001 commented 3 years ago

呃,不知道你为何这么想,这么愤怒。

  1. 看得出来你很用心的提了这三个问题,而且三个问题确实涉及到实现的细节,我以为你是想把这些问题彻底搞清楚,所以我很真诚的直接推荐你读文档和源码。比如你提的第三个问题是个很好的问题,https://wenet-e2e.github.io/wenet/runtime.html,我们这个文档里有清楚的描述
  2. 很多开源社区的力量目前也参与到 wenet 的开发中来,比如 gRPC 这一部分就是喜马拉雅的同学做的实现,关于这部分的细节除了阅读代码外,还可以在交流群里面直接请教喜马拉雅的吕翔同学。
  3. 无论是大公司、还是小公司都有很多优秀的工程师,做出很多有意义的工作和事情。wenet 有很多大公司的同学也在使用或一起参与研发,如腾讯、华为、京东、网易、zoom、字节等等,也有很多小公司的同学也贡献了很多。大家还是希望一起做事情,把 wenet 做的越来越好,越来越易用。

wenet 开放这么久以来,还是第一次出现这么没有礼貌的回复和人格的侮辱。如果真心想弄懂问题,就多点平静,少点无谓的愤怒,踏踏实实的读文档和代码,也欢迎在交流群里多讨论。

yjiangling commented 3 years ago

呃,不知道你为何这么想,这么愤怒。

  1. 看得出来你很用心的提了这三个问题,而且三个问题确实涉及到实现的细节,我以为你是想把这些问题彻底搞清楚,所以我很真诚的直接推荐你读文档和源码。比如你提的第三个问题是个很好的问题,https://wenet-e2e.github.io/wenet/runtime.html,我们这个文档里有清楚的描述。
  2. 很多开源社区的力量目前也参与到 wenet 的开发中来,比如 gRPC 这一部分就是喜马拉雅的同学做的实现,关于这部分的细节除了阅读代码外,还可以在交流群里面直接请教喜马拉雅的吕翔同学。
  3. 无论是大公司、还是小公司都有很多优秀的工程师,做出很多有意义的工作和事情。wenet 有很多大公司的同学也在使用或一起参与研发,如腾讯、华为、京东、网易、zoom、字节等等,也有很多小公司的同学也贡献了很多。大家还是希望一起做事情,把 wenet 做的越来越好,越来越易用。

wenet 开放这么久以来,还是第一次出现这么没有礼貌的回复和人格的侮辱。如果真心想弄懂问题,就多点平静,少点无谓的愤怒,踏踏实实的读文档和代码,也欢迎在交流群里多讨论。

谢谢,不好意思,失态了,源码确实也看了好久,PyTorch部分倒是能看懂,无奈C部分确实看不懂,所以想请教一下,实在不好意思,我为我的粗鲁真诚的向你道歉

robin1001 commented 3 years ago

好的,不客气,理解万岁。

问题1和2主要是协议和应用问题,除了参考 wenet,还可以参考

  1. 依图 https://speech.yitutech.com/devdoc/liveaudio
  2. 讯飞 https://www.xfyun.cn/doc/asr/rtasr/API.html的接口文档设计

问题3 python 和 c++ 的代码都有相应的实现, python 的请参考:https://github.com/wenet-e2e/wenet/blob/main/wenet/transformer/encoder.py#L169

robin1001 commented 3 years ago

还有,最好是用英文提问题,这样国际友人有同样的问题的话,也会对他们有帮助。