yányào.com

poorman's ASR solution

Intro

大概20年h2期间,听闻feishu支持了会议自动转译字幕功能,but 当时私有化部署的版本一直没有支持,于是私下找了语音助手团队的同学企图蹭服务用于自动生成会议纪要,懒即是原动力

再 but 一下,出于服务成本考量没有蹭成功,后来对应的同学也陆续离职就没下文了

23年大模型开始各种火热起来,于是借助 openai 的 whisper 在本地陆续写了一些音频转文本的小任务,比如 yt-dlp 下载 bilibili 视频后转音频再转文本,个人习惯上阅读的效率还是高于视频形式的

另外结合语音识别和 LLM 的发散,也试着搓了点语音助手的尝试

但是实时语音识别场景,用 whiper-stream / sense-voice 这类方案还是会有识别不准确、内容丢失的问题存在,调整 step/length 参数效果也不明显,vad 方案延迟也很高…

New solution

上周忽然想起了 kaldi 项目也蛮经典了,于是就试着用 sherpa-[ncnn|onnx] 尝试了下 demo sherpa-[ncnn|onnx]-microphone 流式识别输出的整体效果已经很接近把音频文件喂给大模型的质量

于是联系维护者 @csukuangfj 请教怎么提升识别准确率,大佬过于卷周末还给造了新方案和输出优化,甚至还录了 b 站视频 https://www.bilibili.com/video/BV1xcEMz8EsX/

另外也体验到 two-pass 双模型识别的效果,两种方式都能满足俺的使用场景🎉

在大佬的基础示例上,简单补充点内容的保存

          result = result.lower().strip()
          display.update_text(result)
+          log(result)
          display.finalize_current_sentence()
          display.display()
        else:
          sample_buffers = []

        first_recognizer.reset(stream)


+ def log(result):
+   global file_handler
+   file_handler.write(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} - {result}\n")
+   file_handler.flush()


if __name__ == "__main__":
+  from datetime import datetime
+
+  ts = datetime.now().strftime("%y%m%d%H%M%S")
+  file_path = Path(f"~/Desktop/asr/2pass.{ts}.txt").expanduser()
+  file_handler = open(file_path, "a")
  try:
    main()
  except KeyboardInterrupt:
    print("\nCaught Ctrl + C. Exiting")
+  finally:
+    file_handler.close()