BatchalignHK 0.7.22.post28__tar.gz → 0.7.22.post30__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/BatchalignHK.egg-info/PKG-INFO +4 -12
  2. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/BatchalignHK.egg-info/SOURCES.txt +1 -0
  3. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/BatchalignHK.egg-info/requires.txt +2 -1
  4. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/PKG-INFO +4 -12
  5. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/cli/cli.py +18 -20
  6. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/formats/chat/generator.py +2 -1
  7. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/__init__.py +1 -1
  8. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/dispatch.py +3 -1
  9. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/fa/__init__.py +1 -0
  10. batchalignhk-0.7.22.post30/batchalign/pipelines/fa/iic_fa.py +227 -0
  11. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/version +1 -1
  12. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/setup.py +2 -1
  13. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/BatchalignHK.egg-info/dependency_links.txt +0 -0
  14. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/BatchalignHK.egg-info/entry_points.txt +0 -0
  15. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/BatchalignHK.egg-info/top_level.txt +0 -0
  16. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/LICENSE +0 -0
  17. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/MANIFEST.in +0 -0
  18. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/README.md +0 -0
  19. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/__init__.py +0 -0
  20. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/__main__.py +0 -0
  21. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/cli/__init__.py +0 -0
  22. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/cli/dispatch.py +0 -0
  23. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/constants.py +0 -0
  24. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/document.py +0 -0
  25. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/errors.py +0 -0
  26. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/__init__.py +0 -0
  27. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/core.py +0 -0
  28. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/exception.py +0 -0
  29. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/logging.py +0 -0
  30. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/realtime_meeting.py +0 -0
  31. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/speech_recognizer.py +0 -0
  32. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/speech_synthesizer.py +0 -0
  33. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/speech_transcriber.py +0 -0
  34. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/stream_input_tts.py +0 -0
  35. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/token.py +0 -0
  36. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/util.py +0 -0
  37. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/version.py +0 -0
  38. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/__init__.py +0 -0
  39. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/_abnf.py +0 -0
  40. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/_app.py +0 -0
  41. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/_cookiejar.py +0 -0
  42. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/_core.py +0 -0
  43. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/_exceptions.py +0 -0
  44. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/_handshake.py +0 -0
  45. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/_http.py +0 -0
  46. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/_logging.py +0 -0
  47. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/_socket.py +0 -0
  48. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/_ssl_compat.py +0 -0
  49. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/_url.py +0 -0
  50. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/_utils.py +0 -0
  51. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/tests/__init__.py +0 -0
  52. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/tests/echo-server.py +0 -0
  53. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/tests/test_abnf.py +0 -0
  54. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/tests/test_app.py +0 -0
  55. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/tests/test_cookiejar.py +0 -0
  56. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/tests/test_http.py +0 -0
  57. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/tests/test_url.py +0 -0
  58. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/extern/nls/websocket/tests/test_websocket.py +0 -0
  59. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/formats/__init__.py +0 -0
  60. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/formats/base.py +0 -0
  61. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/formats/chat/__init__.py +0 -0
  62. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/formats/chat/file.py +0 -0
  63. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/formats/chat/lexer.py +0 -0
  64. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/formats/chat/parser.py +0 -0
  65. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/formats/chat/utils.py +0 -0
  66. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/formats/textgrid/__init__.py +0 -0
  67. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/formats/textgrid/file.py +0 -0
  68. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/formats/textgrid/generator.py +0 -0
  69. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/formats/textgrid/parser.py +0 -0
  70. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/__init__.py +0 -0
  71. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/resolve.py +0 -0
  72. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/speaker/__init__.py +0 -0
  73. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/speaker/config.yaml +0 -0
  74. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/speaker/infer.py +0 -0
  75. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/speaker/utils.py +0 -0
  76. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/training/__init__.py +0 -0
  77. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/training/run.py +0 -0
  78. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/training/utils.py +0 -0
  79. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/utils.py +0 -0
  80. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/utterance/__init__.py +0 -0
  81. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/utterance/cantonese_infer.py +0 -0
  82. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/utterance/dataset.py +0 -0
  83. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/utterance/execute.py +0 -0
  84. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/utterance/infer.py +0 -0
  85. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/utterance/prep.py +0 -0
  86. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/utterance/train.py +0 -0
  87. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/wave2vec/__init__.py +0 -0
  88. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/wave2vec/infer_fa.py +0 -0
  89. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/whisper/__init__.py +0 -0
  90. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/whisper/infer_asr.py +0 -0
  91. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/models/whisper/infer_fa.py +0 -0
  92. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/analysis/__init__.py +0 -0
  93. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/analysis/eval.py +0 -0
  94. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/__init__.py +0 -0
  95. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/aliyun.py +0 -0
  96. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/funaudio.py +0 -0
  97. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2chinese.py +0 -0
  98. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/__init__.py +0 -0
  99. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/deu.py +0 -0
  100. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/ell.py +0 -0
  101. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/eng.py +0 -0
  102. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/eus.py +0 -0
  103. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/fra.py +0 -0
  104. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/hrv.py +0 -0
  105. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/ind.py +0 -0
  106. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/jpn.py +0 -0
  107. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/nld.py +0 -0
  108. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/por.py +0 -0
  109. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/spa.py +0 -0
  110. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/num2lang/tha.py +0 -0
  111. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/oai_whisper.py +0 -0
  112. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/rev.py +0 -0
  113. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/tencent.py +0 -0
  114. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/utils.py +0 -0
  115. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/whisper.py +0 -0
  116. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/asr/whisperx.py +0 -0
  117. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/avqi/__init__.py +0 -0
  118. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/avqi/engine.py +0 -0
  119. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/base.py +0 -0
  120. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/cleanup/__init__.py +0 -0
  121. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/cleanup/cleanup.py +0 -0
  122. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/cleanup/disfluencies.py +0 -0
  123. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/cleanup/parse_support.py +0 -0
  124. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/cleanup/retrace.py +0 -0
  125. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/cleanup/support/filled_pauses.eng +0 -0
  126. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/cleanup/support/replacements.eng +0 -0
  127. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/cleanup/support/test.test +0 -0
  128. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/diarization/__init__.py +0 -0
  129. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/diarization/pyannote.py +0 -0
  130. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/fa/wave2vec_fa.py +0 -0
  131. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/fa/whisper_fa.py +0 -0
  132. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/morphosyntax/__init__.py +0 -0
  133. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/morphosyntax/coref.py +0 -0
  134. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/morphosyntax/en/irr.py +0 -0
  135. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/morphosyntax/fr/apm.py +0 -0
  136. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/morphosyntax/fr/apmn.py +0 -0
  137. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/morphosyntax/fr/case.py +0 -0
  138. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/morphosyntax/ja/verbforms.py +0 -0
  139. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/morphosyntax/ud.py +0 -0
  140. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/opensmile/__init__.py +0 -0
  141. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/opensmile/engine.py +0 -0
  142. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/pipeline.py +0 -0
  143. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/speaker/__init__.py +0 -0
  144. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/speaker/nemo_speaker.py +0 -0
  145. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/translate/__init__.py +0 -0
  146. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/translate/gtrans.py +0 -0
  147. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/translate/seamless.py +0 -0
  148. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/translate/utils.py +0 -0
  149. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/utr/__init__.py +0 -0
  150. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/utr/funaudio_utr.py +0 -0
  151. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/utr/rev_utr.py +0 -0
  152. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/utr/tencent_utr.py +0 -0
  153. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/utr/utils.py +0 -0
  154. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/utr/whisper_utr.py +0 -0
  155. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/utterance/__init__.py +0 -0
  156. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/pipelines/utterance/ud_utterance.py +0 -0
  157. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/__init__.py +0 -0
  158. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/conftest.py +0 -0
  159. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/formats/chat/test_chat_file.py +0 -0
  160. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/formats/chat/test_chat_generator.py +0 -0
  161. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/formats/chat/test_chat_lexer.py +0 -0
  162. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/formats/chat/test_chat_parser.py +0 -0
  163. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/formats/chat/test_chat_utils.py +0 -0
  164. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/formats/textgrid/test_textgrid.py +0 -0
  165. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/pipelines/analysis/test_eval.py +0 -0
  166. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/pipelines/asr/test_asr_pipeline.py +0 -0
  167. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/pipelines/asr/test_asr_utils.py +0 -0
  168. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/pipelines/cleanup/test_disfluency.py +0 -0
  169. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/pipelines/cleanup/test_parse_support.py +0 -0
  170. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/pipelines/fa/test_fa_pipeline.py +0 -0
  171. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/pipelines/fixures.py +0 -0
  172. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/pipelines/test_pipeline.py +0 -0
  173. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/pipelines/test_pipeline_models.py +0 -0
  174. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/tests/test_document.py +0 -0
  175. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/utils/__init__.py +0 -0
  176. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/utils/abbrev.py +0 -0
  177. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/utils/compounds.py +0 -0
  178. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/utils/config.py +0 -0
  179. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/utils/dp.py +0 -0
  180. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/utils/names.py +0 -0
  181. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/batchalign/utils/utils.py +0 -0
  182. {batchalignhk-0.7.22.post28 → batchalignhk-0.7.22.post30}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.1
2
2
  Name: BatchalignHK
3
- Version: 0.7.22.post28
3
+ Version: 0.7.22.post30
4
4
  Summary: Python Speech Language Sample Analysis
5
5
  Author: Brian MacWhinney, Houjun Liu
6
6
  Author-email: macw@cmu.edu, houjun@cmu.edu
@@ -29,7 +29,7 @@ Requires-Dist: omegaconf
29
29
  Requires-Dist: click~=8.1
30
30
  Requires-Dist: matplotlib<4.0.0,>=3.8.0
31
31
  Requires-Dist: pyfiglet==1.0.2
32
- Requires-Dist: setuptools>=78.1.1
32
+ Requires-Dist: setuptools
33
33
  Requires-Dist: soundfile~=0.12.0
34
34
  Requires-Dist: rich-click>=1.7.0
35
35
  Requires-Dist: typing-extensions
@@ -44,6 +44,7 @@ Requires-Dist: aliyun-python-sdk-core>=2.13.3
44
44
  Requires-Dist: oss2
45
45
  Requires-Dist: openai-whisper>=20240930
46
46
  Requires-Dist: funasr
47
+ Requires-Dist: modelscope[audio,nlp]
47
48
  Requires-Dist: cos-python-sdk-v5
48
49
  Requires-Dist: openai-whisper
49
50
  Requires-Dist: llvmlite>=0.44.0
@@ -60,15 +61,6 @@ Requires-Dist: accelerate~=0.27; extra == "train"
60
61
  Provides-Extra: docs
61
62
  Requires-Dist: mkdocs-material; extra == "docs"
62
63
  Requires-Dist: mkdocs-click; extra == "docs"
63
- Dynamic: author
64
- Dynamic: author-email
65
- Dynamic: classifier
66
- Dynamic: description
67
- Dynamic: description-content-type
68
- Dynamic: license-file
69
- Dynamic: provides-extra
70
- Dynamic: requires-dist
71
- Dynamic: summary
72
64
 
73
65
  # TalkBank | Batchalign2
74
66
 
@@ -126,6 +126,7 @@ batchalign/pipelines/cleanup/support/test.test
126
126
  batchalign/pipelines/diarization/__init__.py
127
127
  batchalign/pipelines/diarization/pyannote.py
128
128
  batchalign/pipelines/fa/__init__.py
129
+ batchalign/pipelines/fa/iic_fa.py
129
130
  batchalign/pipelines/fa/wave2vec_fa.py
130
131
  batchalign/pipelines/fa/whisper_fa.py
131
132
  batchalign/pipelines/morphosyntax/__init__.py
@@ -19,7 +19,7 @@ omegaconf
19
19
  click~=8.1
20
20
  matplotlib<4.0.0,>=3.8.0
21
21
  pyfiglet==1.0.2
22
- setuptools>=78.1.1
22
+ setuptools
23
23
  soundfile~=0.12.0
24
24
  rich-click>=1.7.0
25
25
  typing-extensions
@@ -34,6 +34,7 @@ aliyun-python-sdk-core>=2.13.3
34
34
  oss2
35
35
  openai-whisper>=20240930
36
36
  funasr
37
+ modelscope[audio,nlp]
37
38
  cos-python-sdk-v5
38
39
  openai-whisper
39
40
  llvmlite>=0.44.0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.1
2
2
  Name: BatchalignHK
3
- Version: 0.7.22.post28
3
+ Version: 0.7.22.post30
4
4
  Summary: Python Speech Language Sample Analysis
5
5
  Author: Brian MacWhinney, Houjun Liu
6
6
  Author-email: macw@cmu.edu, houjun@cmu.edu
@@ -29,7 +29,7 @@ Requires-Dist: omegaconf
29
29
  Requires-Dist: click~=8.1
30
30
  Requires-Dist: matplotlib<4.0.0,>=3.8.0
31
31
  Requires-Dist: pyfiglet==1.0.2
32
- Requires-Dist: setuptools>=78.1.1
32
+ Requires-Dist: setuptools
33
33
  Requires-Dist: soundfile~=0.12.0
34
34
  Requires-Dist: rich-click>=1.7.0
35
35
  Requires-Dist: typing-extensions
@@ -44,6 +44,7 @@ Requires-Dist: aliyun-python-sdk-core>=2.13.3
44
44
  Requires-Dist: oss2
45
45
  Requires-Dist: openai-whisper>=20240930
46
46
  Requires-Dist: funasr
47
+ Requires-Dist: modelscope[audio,nlp]
47
48
  Requires-Dist: cos-python-sdk-v5
48
49
  Requires-Dist: openai-whisper
49
50
  Requires-Dist: llvmlite>=0.44.0
@@ -60,15 +61,6 @@ Requires-Dist: accelerate~=0.27; extra == "train"
60
61
  Provides-Extra: docs
61
62
  Requires-Dist: mkdocs-material; extra == "docs"
62
63
  Requires-Dist: mkdocs-click; extra == "docs"
63
- Dynamic: author
64
- Dynamic: author-email
65
- Dynamic: classifier
66
- Dynamic: description
67
- Dynamic: description-content-type
68
- Dynamic: license-file
69
- Dynamic: provides-extra
70
- Dynamic: requires-dist
71
- Dynamic: summary
72
64
 
73
65
  # TalkBank | Batchalign2
74
66
 
@@ -110,6 +110,7 @@ batchalign.add_command(train, "models")
110
110
  default=False, help="For utterance timing recovery, OpenAI Whisper (ASR) instead of Rev.AI (default).")
111
111
  @click.option("--wav2vec/--whisper_fa",
112
112
  default=True, help="Use Whisper instead of Wav2Vec for English (defaults for Whisper for non-English)")
113
+ @click.option("--iic", is_flag=True, default=False, help="Use IIC forced alignment (for Chinese).")
113
114
  @click.option("--tencent/--rev",
114
115
  default=False, help="Use Tencent instead of Rev.AI (default).")
115
116
  @click.option("--funaudio/--rev",
@@ -118,7 +119,7 @@ batchalign.add_command(train, "models")
118
119
  @click.option("--wor/--nowor",
119
120
  default=True, help="Should we write word level alignment line? Default to yes.")
120
121
  @click.pass_context
121
- def align(ctx, in_dir, out_dir, whisper, wav2vec, tencent, funaudio, **kwargs):
122
+ def align(ctx, in_dir, out_dir, whisper, wav2vec, iic, tencent, funaudio, **kwargs):
122
123
  """Align transcripts against corresponding media files."""
123
124
  def loader(file):
124
125
  return (
@@ -129,26 +130,23 @@ def align(ctx, in_dir, out_dir, whisper, wav2vec, tencent, funaudio, **kwargs):
129
130
  def writer(doc, output):
130
131
  CHATFile(doc=doc).write(output, write_wor=kwargs.get("wor", True))
131
132
 
132
- if not wav2vec:
133
- _dispatch("align", "eng", 1,
134
- ["cha"], ctx,
135
- in_dir, out_dir,
136
- loader, writer, C,
137
- fa="whisper_fa",
138
- utr = ("whisper_utr" if whisper else
139
- ("tencent_utr" if tencent else
140
- ("funaudio_utr" if funaudio else "rev_utr"))),
141
- **kwargs)
133
+ # Determine FA engine
134
+ if iic:
135
+ fa_engine = "iic_fa"
136
+ elif not wav2vec:
137
+ fa_engine = "whisper_fa"
142
138
  else:
143
- _dispatch("align", "eng", 1,
144
- ["cha"], ctx,
145
- in_dir, out_dir,
146
- loader, writer, C,
147
- fa="wav2vec_fa",
148
- utr = ("whisper_utr" if whisper else
149
- ("tencent_utr" if tencent else
150
- ("funaudio_utr" if funaudio else "rev_utr"))),
151
- **kwargs)
139
+ fa_engine = "wav2vec_fa"
140
+
141
+ _dispatch("align", "eng", 1,
142
+ ["cha"], ctx,
143
+ in_dir, out_dir,
144
+ loader, writer, C,
145
+ fa=fa_engine,
146
+ utr = ("whisper_utr" if whisper else
147
+ ("tencent_utr" if tencent else
148
+ ("funaudio_utr" if funaudio else "rev_utr"))),
149
+ **kwargs)
152
150
 
153
151
  #################### TRANSCRIBE ################################
154
152
 
@@ -32,13 +32,14 @@ def generate_chat_utterance(utterance: Utterance, special_mor=False, write_wor=T
32
32
  # last minut ecorrections
33
33
  # main_line = re.sub(r"<([\w ]+) \[\/", r"<\1> [/", main_line)
34
34
  if merge_letters:
35
- main_line = re.sub(r"(?<!:[a-z]*)[a-z] ", r"\1", main_line)
35
+ main_line = re.sub(r"(?<!:[a-z]*)([a-z]) ", r"\1", main_line)
36
36
  main_line = re.sub(r"([a-z])([^a-z])", r"\1 \2", main_line)
37
37
  main_line = re.sub(r"([a-z]) (\d+)", r"\1\2", main_line)
38
38
  main_line = re.sub(r"([a-z]) @", r"\1@", main_line)
39
39
  main_line = re.sub(r"([a-z]) :", r"\1:", main_line)
40
40
  main_line = re.sub(r"([a-z]) >", r"\1>", main_line)
41
41
  main_line = re.sub(r"([a-z]) ]", r"\1]", main_line)
42
+ main_line = re.sub(r"(?:[a-z]) ?\(([a-z]+) ?\)", r"(\1)", main_line)
42
43
  main_line = re.sub(r"([a-z]) _", r"\1_", main_line)
43
44
  main_line = re.sub(r" ", r" ", main_line)
44
45
  main_line = re.sub(r"«", "“", main_line)
@@ -7,7 +7,7 @@ from .morphosyntax import StanzaEngine, CorefEngine
7
7
  from .cleanup import NgramRetraceEngine, DisfluencyReplacementEngine
8
8
  from .speaker import NemoSpeakerEngine
9
9
 
10
- from .fa import WhisperFAEngine, Wave2VecFAEngine
10
+ from .fa import WhisperFAEngine, Wave2VecFAEngine, IICFAEngine
11
11
  from .utr import WhisperUTREngine, RevUTREngine, TencentUTREngine, FunAudioUTREngine
12
12
 
13
13
  from .analysis import EvaluationEngine
@@ -9,7 +9,7 @@ from batchalign import (WhisperEngine, WhisperFAEngine, StanzaEngine, RevEngine,
9
9
  StanzaUtteranceEngine, CorefEngine, Wave2VecFAEngine, TencentEngine,
10
10
  OAIWhisperEngine, TencentUTREngine, AliyunEngine, FunAudioEngine,
11
11
  FunAudioUTREngine, SeamlessTranslationModel, GoogleTranslateEngine,
12
- OAIWhisperEngine, PyannoteEngine)
12
+ OAIWhisperEngine, PyannoteEngine, IICFAEngine)
13
13
 
14
14
  from batchalign import BatchalignPipeline
15
15
  from batchalign.models import resolve
@@ -135,6 +135,8 @@ def dispatch_pipeline(pkg_str, lang, num_speakers=None, **arg_overrides):
135
135
  engines.append(CorefEngine())
136
136
  elif engine == "wav2vec_fa":
137
137
  engines.append(Wave2VecFAEngine())
138
+ elif engine == "iic_fa":
139
+ engines.append(IICFAEngine())
138
140
  elif engine == "seamless_translate":
139
141
  engines.append(SeamlessTranslationModel())
140
142
  elif engine == "tencent":
@@ -1,2 +1,3 @@
1
1
  from .whisper_fa import WhisperFAEngine
2
2
  from .wave2vec_fa import Wave2VecFAEngine
3
+ from .iic_fa import IICFAEngine
@@ -0,0 +1,227 @@
1
+ from batchalign.document import *
2
+ from batchalign.pipelines.base import *
3
+ from batchalign.utils import *
4
+ from batchalign.utils.dp import *
5
+ from batchalign.constants import *
6
+ from batchalign.models.utils import ASRAudioFile
7
+
8
+ import logging
9
+ L = logging.getLogger("batchalign")
10
+
11
+ import re
12
+ import warnings
13
+ import tempfile
14
+ import os
15
+
16
+ from modelscope.pipelines import pipeline
17
+ from modelscope.utils.constant import Tasks
18
+
19
+ import torch
20
+ from torchaudio import load
21
+ from torchaudio import transforms as T
22
+ import torchaudio
23
+
24
+ class IICFAEngine(BatchalignEngine):
25
+ tasks = [ Task.FORCED_ALIGNMENT ]
26
+
27
+ def _hook_status(self, status_hook):
28
+ self.status_hook = status_hook
29
+
30
+ def __init__(self):
31
+ self.status_hook = None
32
+ self.__iic = pipeline(
33
+ task=Tasks.speech_timestamp,
34
+ model='iic/speech_timestamp_prediction-v1-16k-offline',
35
+ model_revision="v2.0.4",
36
+ output_dir='./tmp')
37
+
38
+ def process(self, doc:Document, **kwargs):
39
+ # check that the document has a media path to align to
40
+ assert doc.media != None and doc.media.url != None, f"We cannot forced-align something that doesn't have a media path! Provided media tier='{doc.media}'"
41
+
42
+ if doc.langs[0] not in ["zho", "cmn", "yue"]:
43
+ warnings.warn("Looks like you are not aligning Chinese with IIC; this aligner is designed for Chinese and may not work well with other languages.")
44
+
45
+ # load the audio file
46
+ L.debug(f"IIC FA is loading url {doc.media.url}...")
47
+ audio_arr, rate = load(doc.media.url)
48
+ # transpose and mean to get mono
49
+ audio_tensor = torch.mean(audio_arr.transpose(0,1), dim=1)
50
+ audio_file = ASRAudioFile(doc.media.url, audio_tensor, rate)
51
+ L.debug(f"IIC FA finished loading media.")
52
+
53
+ # collect utterances into 30 secondish segments to be aligned
54
+ # we have to do this because the aligner does poorly with very short segments
55
+ groups = []
56
+ group = []
57
+ seg_start = 0
58
+
59
+ L.debug(f"IIC FA grouping utterances...")
60
+
61
+ for i in doc.content:
62
+ if not isinstance(i, Utterance):
63
+ continue
64
+ if i.alignment == None:
65
+ warnings.warn("We found at least one utterance without utterance-level alignment; this is usually not an issue, but if the entire transcript is unaligned, it means that utterance level timing recovery (which is fuzzy using ASR) failed due to the audio clarity. On this transcript, before running forced-alignment, please supply utterance-level links.")
66
+ continue
67
+
68
+ # pop the previous group onto the stack
69
+ if (i.alignment[-1] - seg_start) > 15*1000:
70
+ groups.append(group)
71
+ group = []
72
+ seg_start = i.alignment[0]
73
+
74
+ # append the contents to the running group
75
+ for word in i.content:
76
+ group.append((word, i.alignment))
77
+
78
+ groups.append(group)
79
+
80
+ L.debug(f"Begin IIC Inference...")
81
+
82
+ for indx, grp in enumerate(groups):
83
+ L.info(f"IIC FA processing segment {indx+1}/{len(groups)}...")
84
+ if self.status_hook != None:
85
+ self.status_hook(indx+1, len(groups))
86
+
87
+ # perform alignment
88
+ try:
89
+ # create transcript with spaces between characters
90
+ transcript = []
91
+ for word, _ in grp:
92
+ # skip punctuation
93
+ if word.text.strip() not in MOR_PUNCT + ENDING_PUNCT:
94
+ # add spaces between each character for Chinese
95
+ transcript.append(" ".join(list(word.text)))
96
+
97
+ transcript_text = " ".join(transcript)
98
+
99
+ if len(transcript_text.strip()) == 0:
100
+ continue
101
+
102
+ # extract audio chunk and write to temp file
103
+ if (grp[-1][1][1] - grp[0][1][0]) < 20*1000:
104
+ # get the audio chunk as tensor
105
+ audio_chunk = audio_file.chunk(grp[0][1][0], grp[-1][1][1])
106
+
107
+ # create temporary file for the audio chunk
108
+ with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as tmp_file:
109
+ tmp_path = tmp_file.name
110
+
111
+ # write the audio chunk to temp file
112
+ torchaudio.save(tmp_path, audio_chunk.unsqueeze(0), rate)
113
+
114
+ try:
115
+ # call IIC aligner with the temp file
116
+ rec_result = self.__iic(input=(tmp_path, transcript_text),
117
+ data_type=("sound", "text"))
118
+ finally:
119
+ # clean up temp file
120
+ if os.path.exists(tmp_path):
121
+ os.unlink(tmp_path)
122
+ else:
123
+ continue
124
+ except Exception as e:
125
+ L.warning(f"IIC alignment failed for segment {indx+1}: {e}")
126
+ continue
127
+
128
+ # parse the result string
129
+ # format: '<sil> 0.000 0.380;一 0.380 0.560;个 0.560 0.800;...'
130
+ try:
131
+ timings = []
132
+ words = []
133
+
134
+ for p in rec_result:
135
+ parts = p["text"].strip().split()
136
+ timestamps = p["timestamp"]
137
+
138
+ for pts,tss in zip(parts, timestamps):
139
+ word, start, end = pts, max(tss[1], 0), max(tss[1], 0)
140
+ words.append(word)
141
+ # convert to milliseconds and add offset
142
+ timings.append((int(start + grp[0][1][0]),
143
+ int(end + grp[0][1][0])))
144
+ except Exception as e:
145
+ raise e
146
+ L.warning(f"Failed to parse IIC result for segment {indx+1}: {e}")
147
+ continue
148
+
149
+ # create reference backplates, which are the word ids to set the timing for
150
+ ref_targets = []
151
+ for indx, (word, _) in enumerate(grp):
152
+ for char in word.text:
153
+ ref_targets.append(ReferenceTarget(char, payload=indx))
154
+
155
+ # create target backplates for the timings
156
+ payload_targets = []
157
+ try:
158
+ for indx, (word, time) in enumerate(zip(words, timings)):
159
+ for char in word:
160
+ payload_targets.append(PayloadTarget(char, payload=indx))
161
+ except Exception as e:
162
+ L.warning(f"Failed to create payload targets for segment {indx+1}: {e}")
163
+ continue
164
+
165
+ # alignment!
166
+ alignments = align(payload_targets, ref_targets, tqdm=False)
167
+
168
+ # set the ids back to the text ids
169
+ # we do this BACKWARDS because we want to have the first timestamp
170
+ # we get about a word first
171
+ alignments.reverse()
172
+ for indx, elem in enumerate(alignments):
173
+ if isinstance(elem, Match):
174
+ grp[elem.reference_payload][0].time = (timings[elem.payload][0],
175
+ timings[elem.payload][1])
176
+
177
+ L.debug(f"Correcting text...")
178
+
179
+ # we now set the end alignment of each word to the start of the next
180
+ for doc_ut, ut in enumerate(doc.content):
181
+ if not isinstance(ut, Utterance):
182
+ continue
183
+
184
+ # correct each word by bumping it forward
185
+ # and if its not a word we remove the timing
186
+ for indx, w in enumerate(ut.content):
187
+ if w.type in [TokenType.PUNCT, TokenType.FEAT, TokenType.ANNOT]:
188
+ w.time = None
189
+ elif indx == len(ut.content)-1 and w.text in ENDING_PUNCT:
190
+ w.time = None
191
+ elif indx != len(ut.content)-1:
192
+ # search forward for the next compatible time
193
+ tmp = indx+1
194
+ while tmp < len(ut.content)-1 and ut.content[tmp].time == None:
195
+ tmp += 1
196
+ if w.time == None:
197
+ continue
198
+ if ut.content[tmp].time == None:
199
+ # seek forward one utterance to find their start time
200
+ next_ut = doc_ut + 1
201
+ while next_ut < len(doc.content)-1 and (not isinstance(doc.content, Utterance) or doc.content[next_ut].alignment == None):
202
+ next_ut += 1
203
+ if next_ut < len(doc.content) and isinstance(doc.content, Utterance) and doc.content[next_ut].alignment:
204
+ w.time = (w.time[0], doc.content[next_ut].alignment[0])
205
+ else:
206
+ w.time = (w.time[0], w.time[0]+500) # give half a second because we don't know
207
+
208
+ # just in case, bound the time by the utterance derived timings
209
+ if ut.alignment and ut.alignment[0] != None:
210
+ w.time = (max(w.time[0], ut.alignment[0]), min(w.time[1], ut.alignment[1]))
211
+ # if we ended up with timings that don't make sense, drop it
212
+ if w.time and w.time[0] >= w.time[1]:
213
+ w.time = None
214
+
215
+ # clear any built-in timing (i.e. we should use utterance-derived timing)
216
+ ut.time = None
217
+ # correct the text
218
+ if ut.alignment and ut.text != None:
219
+ if '\x15' not in ut.text:
220
+ ut.text = (ut.text+f" \x15{ut.alignment[0]}_{ut.alignment[1]}\x15").strip()
221
+ else:
222
+ ut.text = re.sub(r"\x15\d+_\d+\x15",
223
+ f"\x15{ut.alignment[0]}_{ut.alignment[1]}\x15", ut.text).strip()
224
+ elif ut.text != None:
225
+ ut.text = re.sub(r"\x15\d+_\d+\x15", f"", ut.text).strip()
226
+
227
+ return doc
@@ -1,3 +1,3 @@
1
- 0.7.22-post.28
1
+ 0.7.22-post.30
2
2
  November 28rd, 2025
3
3
  Tencent Fixes
@@ -51,7 +51,7 @@ setup(
51
51
  "click~=8.1",
52
52
  "matplotlib>=3.8.0,<4.0.0",
53
53
  "pyfiglet==1.0.2",
54
- "setuptools>=78.1.1",
54
+ "setuptools",
55
55
  "soundfile~=0.12.0",
56
56
  "rich-click>=1.7.0",
57
57
  "typing-extensions",
@@ -66,6 +66,7 @@ setup(
66
66
  "oss2",
67
67
  "openai-whisper>=20240930",
68
68
  "funasr",
69
+ "modelscope[nlp,audio]",
69
70
  "cos-python-sdk-v5",
70
71
  "openai-whisper",
71
72
  "llvmlite>=0.44.0",