offline-stream.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "precomp.h"
  2. namespace funasr {
  3. OfflineStream::OfflineStream(std::map<std::string, std::string>& model_path, int thread_num)
  4. {
  5. // VAD model
  6. if(model_path.find(VAD_DIR) != model_path.end()){
  7. string vad_model_path;
  8. string vad_cmvn_path;
  9. string vad_config_path;
  10. vad_model_path = PathAppend(model_path.at(VAD_DIR), MODEL_NAME);
  11. if(model_path.find(VAD_QUANT) != model_path.end() && model_path.at(VAD_QUANT) == "true"){
  12. vad_model_path = PathAppend(model_path.at(VAD_DIR), QUANT_MODEL_NAME);
  13. }
  14. vad_cmvn_path = PathAppend(model_path.at(VAD_DIR), VAD_CMVN_NAME);
  15. vad_config_path = PathAppend(model_path.at(VAD_DIR), VAD_CONFIG_NAME);
  16. if (access(vad_model_path.c_str(), F_OK) != 0 ||
  17. access(vad_cmvn_path.c_str(), F_OK) != 0 ||
  18. access(vad_config_path.c_str(), F_OK) != 0 )
  19. {
  20. LOG(INFO) << "VAD model file is not exist, skip load vad model.";
  21. }else{
  22. vad_handle = make_unique<FsmnVad>();
  23. vad_handle->InitVad(vad_model_path, vad_cmvn_path, vad_config_path, thread_num);
  24. use_vad = true;
  25. }
  26. }
  27. // AM model
  28. if(model_path.find(MODEL_DIR) != model_path.end()){
  29. string am_model_path;
  30. string am_cmvn_path;
  31. string am_config_path;
  32. string hw_compile_model_path;
  33. string seg_dict_path;
  34. asr_handle = make_unique<Paraformer>();
  35. bool enable_hotword = false;
  36. hw_compile_model_path = PathAppend(model_path.at(MODEL_DIR), MODEL_EB_NAME);
  37. seg_dict_path = PathAppend(model_path.at(MODEL_DIR), MODEL_SEG_DICT);
  38. if (access(hw_compile_model_path.c_str(), F_OK) == 0) { // if model_eb.onnx exist, hotword enabled
  39. enable_hotword = true;
  40. asr_handle->InitHwCompiler(hw_compile_model_path, thread_num);
  41. asr_handle->InitSegDict(seg_dict_path);
  42. }
  43. if (enable_hotword) {
  44. am_model_path = PathAppend(model_path.at(MODEL_DIR), MODEL_NAME);
  45. if(model_path.find(QUANTIZE) != model_path.end() && model_path.at(QUANTIZE) == "true"){
  46. am_model_path = PathAppend(model_path.at(MODEL_DIR), QUANT_MODEL_NAME);
  47. }
  48. } else {
  49. am_model_path = PathAppend(model_path.at(MODEL_DIR), MODEL_NAME);
  50. if(model_path.find(QUANTIZE) != model_path.end() && model_path.at(QUANTIZE) == "true"){
  51. am_model_path = PathAppend(model_path.at(MODEL_DIR), QUANT_MODEL_NAME);
  52. }
  53. }
  54. am_cmvn_path = PathAppend(model_path.at(MODEL_DIR), AM_CMVN_NAME);
  55. am_config_path = PathAppend(model_path.at(MODEL_DIR), AM_CONFIG_NAME);
  56. asr_handle->InitAsr(am_model_path, am_cmvn_path, am_config_path, thread_num);
  57. }
  58. // Lm resource
  59. if (model_path.find(LM_DIR) != model_path.end() && model_path.at(LM_DIR) != "") {
  60. string fst_path, lm_config_path, lex_path;
  61. fst_path = PathAppend(model_path.at(LM_DIR), LM_FST_RES);
  62. lm_config_path = PathAppend(model_path.at(LM_DIR), LM_CONFIG_NAME);
  63. lex_path = PathAppend(model_path.at(LM_DIR), LEX_PATH);
  64. if (access(lex_path.c_str(), F_OK) != 0 )
  65. {
  66. LOG(ERROR) << "Lexicon.txt file is not exist, please use the latest version. Skip load LM model.";
  67. }else{
  68. asr_handle->InitLm(fst_path, lm_config_path, lex_path);
  69. }
  70. }
  71. // PUNC model
  72. if(model_path.find(PUNC_DIR) != model_path.end()){
  73. string punc_model_path;
  74. string punc_config_path;
  75. punc_model_path = PathAppend(model_path.at(PUNC_DIR), MODEL_NAME);
  76. if(model_path.find(PUNC_QUANT) != model_path.end() && model_path.at(PUNC_QUANT) == "true"){
  77. punc_model_path = PathAppend(model_path.at(PUNC_DIR), QUANT_MODEL_NAME);
  78. }
  79. punc_config_path = PathAppend(model_path.at(PUNC_DIR), PUNC_CONFIG_NAME);
  80. if (access(punc_model_path.c_str(), F_OK) != 0 ||
  81. access(punc_config_path.c_str(), F_OK) != 0 )
  82. {
  83. LOG(INFO) << "PUNC model file is not exist, skip load punc model.";
  84. }else{
  85. punc_handle = make_unique<CTTransformer>();
  86. punc_handle->InitPunc(punc_model_path, punc_config_path, thread_num);
  87. use_punc = true;
  88. }
  89. }
  90. #if !defined(__APPLE__)
  91. // Optional: ITN, here we just support language_type=MandarinEnglish
  92. if(model_path.find(ITN_DIR) != model_path.end() && model_path.at(ITN_DIR) != ""){
  93. string itn_tagger_path = PathAppend(model_path.at(ITN_DIR), ITN_TAGGER_NAME);
  94. string itn_verbalizer_path = PathAppend(model_path.at(ITN_DIR), ITN_VERBALIZER_NAME);
  95. if (access(itn_tagger_path.c_str(), F_OK) != 0 ||
  96. access(itn_verbalizer_path.c_str(), F_OK) != 0 )
  97. {
  98. LOG(INFO) << "ITN model file is not exist, skip load ITN model.";
  99. }else{
  100. itn_handle = make_unique<ITNProcessor>();
  101. itn_handle->InitITN(itn_tagger_path, itn_verbalizer_path, thread_num);
  102. use_itn = true;
  103. }
  104. }
  105. #endif
  106. }
  107. OfflineStream *CreateOfflineStream(std::map<std::string, std::string>& model_path, int thread_num)
  108. {
  109. OfflineStream *mm;
  110. mm = new OfflineStream(model_path, thread_num);
  111. return mm;
  112. }
  113. } // namespace funasr