BatchalignHK 0.7.22.post34__tar.gz → 0.7.23.post1__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 (184) hide show
  1. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/BatchalignHK.egg-info/PKG-INFO +3 -11
  2. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/BatchalignHK.egg-info/SOURCES.txt +1 -0
  3. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/BatchalignHK.egg-info/requires.txt +1 -0
  4. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/PKG-INFO +3 -11
  5. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/cli/cli.py +5 -2
  6. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/formats/chat/file.py +4 -4
  7. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/__init__.py +1 -1
  8. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/dispatch.py +3 -1
  9. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/fa/__init__.py +1 -0
  10. batchalignhk-0.7.23.post1/batchalign/pipelines/fa/wave2vec_fa_canto.py +185 -0
  11. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/utr/tencent_utr.py +3 -2
  12. batchalignhk-0.7.23.post1/batchalign/version +3 -0
  13. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/setup.py +2 -1
  14. batchalignhk-0.7.22.post34/batchalign/version +0 -3
  15. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/BatchalignHK.egg-info/dependency_links.txt +0 -0
  16. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/BatchalignHK.egg-info/entry_points.txt +0 -0
  17. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/BatchalignHK.egg-info/top_level.txt +0 -0
  18. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/LICENSE +0 -0
  19. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/MANIFEST.in +0 -0
  20. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/README.md +0 -0
  21. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/__init__.py +0 -0
  22. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/__main__.py +0 -0
  23. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/cli/__init__.py +0 -0
  24. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/cli/dispatch.py +0 -0
  25. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/constants.py +0 -0
  26. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/document.py +0 -0
  27. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/errors.py +0 -0
  28. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/__init__.py +0 -0
  29. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/core.py +0 -0
  30. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/exception.py +0 -0
  31. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/logging.py +0 -0
  32. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/realtime_meeting.py +0 -0
  33. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/speech_recognizer.py +0 -0
  34. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/speech_synthesizer.py +0 -0
  35. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/speech_transcriber.py +0 -0
  36. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/stream_input_tts.py +0 -0
  37. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/token.py +0 -0
  38. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/util.py +0 -0
  39. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/version.py +0 -0
  40. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/__init__.py +0 -0
  41. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/_abnf.py +0 -0
  42. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/_app.py +0 -0
  43. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/_cookiejar.py +0 -0
  44. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/_core.py +0 -0
  45. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/_exceptions.py +0 -0
  46. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/_handshake.py +0 -0
  47. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/_http.py +0 -0
  48. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/_logging.py +0 -0
  49. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/_socket.py +0 -0
  50. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/_ssl_compat.py +0 -0
  51. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/_url.py +0 -0
  52. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/_utils.py +0 -0
  53. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/tests/__init__.py +0 -0
  54. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/tests/echo-server.py +0 -0
  55. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/tests/test_abnf.py +0 -0
  56. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/tests/test_app.py +0 -0
  57. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/tests/test_cookiejar.py +0 -0
  58. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/tests/test_http.py +0 -0
  59. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/tests/test_url.py +0 -0
  60. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/extern/nls/websocket/tests/test_websocket.py +0 -0
  61. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/formats/__init__.py +0 -0
  62. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/formats/base.py +0 -0
  63. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/formats/chat/__init__.py +0 -0
  64. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/formats/chat/generator.py +0 -0
  65. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/formats/chat/lexer.py +0 -0
  66. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/formats/chat/parser.py +0 -0
  67. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/formats/chat/utils.py +0 -0
  68. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/formats/textgrid/__init__.py +0 -0
  69. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/formats/textgrid/file.py +0 -0
  70. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/formats/textgrid/generator.py +0 -0
  71. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/formats/textgrid/parser.py +0 -0
  72. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/__init__.py +0 -0
  73. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/resolve.py +0 -0
  74. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/speaker/__init__.py +0 -0
  75. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/speaker/config.yaml +0 -0
  76. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/speaker/infer.py +0 -0
  77. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/speaker/utils.py +0 -0
  78. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/training/__init__.py +0 -0
  79. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/training/run.py +0 -0
  80. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/training/utils.py +0 -0
  81. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/utils.py +0 -0
  82. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/utterance/__init__.py +0 -0
  83. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/utterance/cantonese_infer.py +0 -0
  84. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/utterance/dataset.py +0 -0
  85. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/utterance/execute.py +0 -0
  86. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/utterance/infer.py +0 -0
  87. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/utterance/prep.py +0 -0
  88. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/utterance/train.py +0 -0
  89. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/wave2vec/__init__.py +0 -0
  90. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/wave2vec/infer_fa.py +0 -0
  91. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/whisper/__init__.py +0 -0
  92. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/whisper/infer_asr.py +0 -0
  93. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/models/whisper/infer_fa.py +0 -0
  94. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/analysis/__init__.py +0 -0
  95. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/analysis/eval.py +0 -0
  96. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/__init__.py +0 -0
  97. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/aliyun.py +0 -0
  98. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/funaudio.py +0 -0
  99. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2chinese.py +0 -0
  100. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/__init__.py +0 -0
  101. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/deu.py +0 -0
  102. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/ell.py +0 -0
  103. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/eng.py +0 -0
  104. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/eus.py +0 -0
  105. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/fra.py +0 -0
  106. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/hrv.py +0 -0
  107. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/ind.py +0 -0
  108. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/jpn.py +0 -0
  109. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/nld.py +0 -0
  110. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/por.py +0 -0
  111. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/spa.py +0 -0
  112. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/num2lang/tha.py +0 -0
  113. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/oai_whisper.py +0 -0
  114. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/rev.py +0 -0
  115. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/tencent.py +0 -0
  116. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/utils.py +0 -0
  117. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/whisper.py +0 -0
  118. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/asr/whisperx.py +0 -0
  119. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/avqi/__init__.py +0 -0
  120. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/avqi/engine.py +0 -0
  121. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/base.py +0 -0
  122. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/cleanup/__init__.py +0 -0
  123. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/cleanup/cleanup.py +0 -0
  124. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/cleanup/disfluencies.py +0 -0
  125. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/cleanup/parse_support.py +0 -0
  126. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/cleanup/retrace.py +0 -0
  127. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/cleanup/support/filled_pauses.eng +0 -0
  128. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/cleanup/support/replacements.eng +0 -0
  129. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/cleanup/support/test.test +0 -0
  130. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/diarization/__init__.py +0 -0
  131. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/diarization/pyannote.py +0 -0
  132. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/fa/iic_fa.py +0 -0
  133. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/fa/wave2vec_fa.py +0 -0
  134. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/fa/whisper_fa.py +0 -0
  135. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/morphosyntax/__init__.py +0 -0
  136. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/morphosyntax/coref.py +0 -0
  137. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/morphosyntax/en/irr.py +0 -0
  138. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/morphosyntax/fr/apm.py +0 -0
  139. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/morphosyntax/fr/apmn.py +0 -0
  140. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/morphosyntax/fr/case.py +0 -0
  141. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/morphosyntax/ja/verbforms.py +0 -0
  142. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/morphosyntax/ud.py +0 -0
  143. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/opensmile/__init__.py +0 -0
  144. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/opensmile/engine.py +0 -0
  145. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/pipeline.py +0 -0
  146. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/speaker/__init__.py +0 -0
  147. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/speaker/nemo_speaker.py +0 -0
  148. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/translate/__init__.py +0 -0
  149. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/translate/gtrans.py +0 -0
  150. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/translate/seamless.py +0 -0
  151. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/translate/utils.py +0 -0
  152. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/utr/__init__.py +0 -0
  153. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/utr/funaudio_utr.py +0 -0
  154. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/utr/rev_utr.py +0 -0
  155. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/utr/utils.py +0 -0
  156. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/utr/whisper_utr.py +0 -0
  157. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/utterance/__init__.py +0 -0
  158. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/pipelines/utterance/ud_utterance.py +0 -0
  159. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/__init__.py +0 -0
  160. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/conftest.py +0 -0
  161. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/formats/chat/test_chat_file.py +0 -0
  162. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/formats/chat/test_chat_generator.py +0 -0
  163. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/formats/chat/test_chat_lexer.py +0 -0
  164. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/formats/chat/test_chat_parser.py +0 -0
  165. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/formats/chat/test_chat_utils.py +0 -0
  166. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/formats/textgrid/test_textgrid.py +0 -0
  167. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/pipelines/analysis/test_eval.py +0 -0
  168. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/pipelines/asr/test_asr_pipeline.py +0 -0
  169. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/pipelines/asr/test_asr_utils.py +0 -0
  170. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/pipelines/cleanup/test_disfluency.py +0 -0
  171. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/pipelines/cleanup/test_parse_support.py +0 -0
  172. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/pipelines/fa/test_fa_pipeline.py +0 -0
  173. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/pipelines/fixures.py +0 -0
  174. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/pipelines/test_pipeline.py +0 -0
  175. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/pipelines/test_pipeline_models.py +0 -0
  176. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/tests/test_document.py +0 -0
  177. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/utils/__init__.py +0 -0
  178. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/utils/abbrev.py +0 -0
  179. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/utils/compounds.py +0 -0
  180. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/utils/config.py +0 -0
  181. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/utils/dp.py +0 -0
  182. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/utils/names.py +0 -0
  183. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/batchalign/utils/utils.py +0 -0
  184. {batchalignhk-0.7.22.post34 → batchalignhk-0.7.23.post1}/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.post34
3
+ Version: 0.7.23.post1
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
@@ -54,6 +54,7 @@ Requires-Dist: pyannote.audio
54
54
  Requires-Dist: onnxruntime
55
55
  Requires-Dist: certifi>=2025.10.5
56
56
  Requires-Dist: regex
57
+ Requires-Dist: pycantonese
57
58
  Provides-Extra: dev
58
59
  Requires-Dist: pytest; extra == "dev"
59
60
  Provides-Extra: train
@@ -61,15 +62,6 @@ Requires-Dist: accelerate~=0.27; extra == "train"
61
62
  Provides-Extra: docs
62
63
  Requires-Dist: mkdocs-material; extra == "docs"
63
64
  Requires-Dist: mkdocs-click; extra == "docs"
64
- Dynamic: author
65
- Dynamic: author-email
66
- Dynamic: classifier
67
- Dynamic: description
68
- Dynamic: description-content-type
69
- Dynamic: license-file
70
- Dynamic: provides-extra
71
- Dynamic: requires-dist
72
- Dynamic: summary
73
65
 
74
66
  # TalkBank | Batchalign2
75
67
 
@@ -128,6 +128,7 @@ batchalign/pipelines/diarization/pyannote.py
128
128
  batchalign/pipelines/fa/__init__.py
129
129
  batchalign/pipelines/fa/iic_fa.py
130
130
  batchalign/pipelines/fa/wave2vec_fa.py
131
+ batchalign/pipelines/fa/wave2vec_fa_canto.py
131
132
  batchalign/pipelines/fa/whisper_fa.py
132
133
  batchalign/pipelines/morphosyntax/__init__.py
133
134
  batchalign/pipelines/morphosyntax/coref.py
@@ -44,6 +44,7 @@ pyannote.audio
44
44
  onnxruntime
45
45
  certifi>=2025.10.5
46
46
  regex
47
+ pycantonese
47
48
 
48
49
  [dev]
49
50
  pytest
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.1
2
2
  Name: BatchalignHK
3
- Version: 0.7.22.post34
3
+ Version: 0.7.23.post1
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
@@ -54,6 +54,7 @@ Requires-Dist: pyannote.audio
54
54
  Requires-Dist: onnxruntime
55
55
  Requires-Dist: certifi>=2025.10.5
56
56
  Requires-Dist: regex
57
+ Requires-Dist: pycantonese
57
58
  Provides-Extra: dev
58
59
  Requires-Dist: pytest; extra == "dev"
59
60
  Provides-Extra: train
@@ -61,15 +62,6 @@ Requires-Dist: accelerate~=0.27; extra == "train"
61
62
  Provides-Extra: docs
62
63
  Requires-Dist: mkdocs-material; extra == "docs"
63
64
  Requires-Dist: mkdocs-click; extra == "docs"
64
- Dynamic: author
65
- Dynamic: author-email
66
- Dynamic: classifier
67
- Dynamic: description
68
- Dynamic: description-content-type
69
- Dynamic: license-file
70
- Dynamic: provides-extra
71
- Dynamic: requires-dist
72
- Dynamic: summary
73
65
 
74
66
  # TalkBank | Batchalign2
75
67
 
@@ -111,6 +111,7 @@ batchalign.add_command(train, "models")
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
113
  @click.option("--iic", is_flag=True, default=False, help="Use IIC forced alignment (for Chinese).")
114
+ @click.option("--wav2vec_yue", is_flag=True, default=False, help="Use Wav2Vec with chantonese fixes forced alignment (for Chinese).")
114
115
  @click.option("--tencent/--rev",
115
116
  default=False, help="Use Tencent instead of Rev.AI (default).")
116
117
  @click.option("--funaudio/--rev",
@@ -119,7 +120,7 @@ batchalign.add_command(train, "models")
119
120
  @click.option("--wor/--nowor",
120
121
  default=True, help="Should we write word level alignment line? Default to yes.")
121
122
  @click.pass_context
122
- def align(ctx, in_dir, out_dir, whisper, wav2vec, iic, tencent, funaudio, **kwargs):
123
+ def align(ctx, in_dir, out_dir, whisper, wav2vec, iic, wav2vec_yue, tencent, funaudio, **kwargs):
123
124
  """Align transcripts against corresponding media files."""
124
125
  def loader(file):
125
126
  return (
@@ -128,11 +129,13 @@ def align(ctx, in_dir, out_dir, whisper, wav2vec, iic, tencent, funaudio, **kwar
128
129
  )
129
130
 
130
131
  def writer(doc, output):
131
- CHATFile(doc=doc).write(output, write_wor=kwargs.get("wor", True))
132
+ CHATFile(doc=doc).write(output, write_wor=kwargs.get("wor", True), dont_merge_letters=True)
132
133
 
133
134
  # Determine FA engine
134
135
  if iic:
135
136
  fa_engine = "iic_fa"
137
+ elif wav2vec_yue:
138
+ fa_engine = "wav2vec_fa_canto"
136
139
  elif not wav2vec:
137
140
  fa_engine = "whisper_fa"
138
141
  else:
@@ -93,7 +93,7 @@ class CHATFile(BaseFormat):
93
93
  self.__doc = doc
94
94
 
95
95
 
96
- def write(self, path, write_wor=True):
96
+ def write(self, path, write_wor=True, dont_merge_letters=False):
97
97
  """Write the CHATFile to file.
98
98
 
99
99
  Parameters
@@ -102,13 +102,13 @@ class CHATFile(BaseFormat):
102
102
  Path of where the CHAT file should get str.
103
103
  """
104
104
 
105
- str_doc = self.__generate(self.__doc, self.__special_mor, write_wor=write_wor)
105
+ str_doc = self.__generate(self.__doc, self.__special_mor, write_wor=write_wor, dont_merge_letters=dont_merge_letters)
106
106
 
107
107
  with open(path, 'w', encoding="utf-8") as df:
108
108
  df.write(str_doc)
109
109
 
110
110
  @staticmethod
111
- def __generate(doc:Document, special=False, write_wor=True):
111
+ def __generate(doc:Document, special=False, write_wor=True, dont_merge_letters=False):
112
112
  utterances = doc.content
113
113
 
114
114
  def __get_birthdays(line):
@@ -130,7 +130,7 @@ class CHATFile(BaseFormat):
130
130
  main.append(generate_chat_utterance(i,
131
131
  special and doc.langs[0] == "eng",
132
132
  write_wor=write_wor,
133
- merge_letters="yue" in doc.langs,
133
+ merge_letters=("yue" in doc.langs and (not dont_merge_letters)),
134
134
  merge_abbrev="eng" in doc.langs))
135
135
  main.append("@End\n")
136
136
 
@@ -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, IICFAEngine
10
+ from .fa import WhisperFAEngine, Wave2VecFAEngine, IICFAEngine, Wave2VecFAEngineCantonese
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, IICFAEngine)
12
+ OAIWhisperEngine, PyannoteEngine, IICFAEngine, Wave2VecFAEngineCantonese)
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 == "wav2vec_fa_canto":
139
+ engines.append(Wave2VecFAEngineCantonese())
138
140
  elif engine == "iic_fa":
139
141
  engines.append(IICFAEngine())
140
142
  elif engine == "seamless_translate":
@@ -1,3 +1,4 @@
1
1
  from .whisper_fa import WhisperFAEngine
2
2
  from .wave2vec_fa import Wave2VecFAEngine
3
+ from .wave2vec_fa_canto import Wave2VecFAEngineCantonese
3
4
  from .iic_fa import IICFAEngine
@@ -0,0 +1,185 @@
1
+ from batchalign.models import Wave2VecFAModel
2
+ from batchalign.document import *
3
+ from batchalign.pipelines.base import *
4
+ from batchalign.utils import *
5
+ from batchalign.utils.dp import *
6
+ from batchalign.constants import *
7
+
8
+ import pycantonese as pc
9
+
10
+ import logging
11
+ L = logging.getLogger("batchalign")
12
+
13
+ import re
14
+
15
+ import pycountry
16
+ import warnings
17
+
18
+
19
+
20
+ class Wave2VecFAEngineCantonese(BatchalignEngine):
21
+ tasks = [ Task.FORCED_ALIGNMENT ]
22
+
23
+ @staticmethod
24
+ def cantonese_to_mms_chars(text: str) -> str:
25
+ pairs = pc.characters_to_jyutping(text)
26
+
27
+ try:
28
+ jyut = " ".join(j for _, j in pairs)
29
+ except TypeError:
30
+ return text
31
+ jyut = re.sub(r"[1-6]", "", jyut)
32
+ jyut = re.sub(r"\s+", "'", jyut).strip("'")
33
+ return jyut
34
+
35
+ def _hook_status(self, status_hook):
36
+ self.status_hook = status_hook
37
+
38
+ def __init__(self):
39
+ self.status_hook = None
40
+ self.__wav2vec = Wave2VecFAModel()
41
+
42
+ def process(self, doc:Document, **kwargs):
43
+ # check that the document has a media path to align to
44
+ 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}'"
45
+ assert "yue" in doc.langs, "Please use normal wav2vec to align non-cantonese speech."
46
+
47
+ # load the audio file
48
+ L.debug(f"Wave2Vec FA is loading url {doc.media.url}...")
49
+ f = self.__wav2vec.load(doc.media.url)
50
+ L.debug(f"Wav2Vec FA finished loading media.")
51
+
52
+ # collect utterances 30 secondish segments to be aligned for whisper
53
+ # we have to do this because whisper does poorly with very short segments
54
+ groups = []
55
+ group = []
56
+ seg_start = 0
57
+
58
+ L.debug(f"Wav2Vec FA finished loading media.")
59
+
60
+ for i in doc.content:
61
+ if not isinstance(i, Utterance):
62
+ continue
63
+ if i.alignment is None:
64
+ 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.")
65
+ continue
66
+
67
+ # pop the previous group onto the stack
68
+ if (i.alignment[-1] - seg_start) > 15*1000:
69
+ groups.append(group)
70
+ group = []
71
+ seg_start = i.alignment[0]
72
+
73
+ # append the contents to the running group
74
+ for word in i.content:
75
+ group.append((word, i.alignment))
76
+
77
+ groups.append(group)
78
+
79
+ L.debug(f"Begin Wav2Vec Inference...")
80
+
81
+ for indx, grp in enumerate(groups):
82
+ L.info(f"Wave2Vec FA processing segment {indx+1}/{len(groups)}...")
83
+ if self.status_hook != None:
84
+ self.status_hook(indx+1, len(groups))
85
+
86
+ # perform alignment
87
+ # we take a 2 second buffer in each direction
88
+ try:
89
+ transcript = [word[0].text for word in grp]
90
+ # replace ANY punctuation
91
+ for p in MOR_PUNCT + ENDING_PUNCT:
92
+ transcript = [i.replace("_", " ") for i in transcript if i.strip() != p]
93
+
94
+ transcript_mms = {r:self.cantonese_to_mms_chars(r) for r in transcript}
95
+ transcript_mms_rev = {v:k for k,v in transcript_mms.items()}
96
+ # if "noone's" in detokenized:
97
+ # breakpoint()
98
+ res = self.__wav2vec(
99
+ audio=f.chunk(grp[0][1][0], grp[-1][1][1]),
100
+ text=[transcript_mms[r] for r in transcript]
101
+ )
102
+ except:
103
+ # utterance contains nothing
104
+ continue
105
+
106
+ # create reference backplates, which are the word ids to set the timing for
107
+ ref_targets = []
108
+ for indx, (word, _) in enumerate(grp):
109
+ for char in word.text:
110
+ ref_targets.append(ReferenceTarget(char, payload=indx))
111
+ # create target backplates for the timings
112
+ payload_targets = []
113
+ timings = []
114
+ try:
115
+ for indx, (word, time) in enumerate(res):
116
+ timings.append(time)
117
+ for char in transcript_mms_rev[word]:
118
+ payload_targets.append(PayloadTarget(char, payload=indx))
119
+ except:
120
+ continue
121
+ # alignment!
122
+ alignments = align(payload_targets, ref_targets, tqdm=False)
123
+
124
+ # set the ids back to the text ids
125
+ # we do this BACKWARDS because we went to have the first timestamp
126
+ # we get about a word first
127
+ alignments.reverse()
128
+ for indx,elem in enumerate(alignments):
129
+ if isinstance(elem, Match):
130
+ grp[elem.reference_payload][0].time = (int(round((timings[elem.payload][0] +
131
+ grp[0][1][0]))),
132
+ int(round((timings[elem.payload][1] +
133
+ grp[0][1][0]))))
134
+
135
+ L.debug(f"Correcting text...")
136
+
137
+ # we now set the end alignment of each word to the start of the next
138
+ for doc_ut, ut in enumerate(doc.content):
139
+ if not isinstance(ut, Utterance):
140
+ continue
141
+
142
+ # correct each word by bumping it forward
143
+ # and if its not a word we remove the timing
144
+ for indx, w in enumerate(ut.content):
145
+ if w.type in [TokenType.PUNCT, TokenType.FEAT, TokenType.ANNOT]:
146
+ w.time = None
147
+ elif indx == len(ut.content)-1 and w.text in ENDING_PUNCT:
148
+ w.time = None
149
+ elif indx != len(ut.content)-1:
150
+ # search forward for the next compatible time
151
+ tmp = indx+1
152
+ while tmp < len(ut.content)-1 and ut.content[tmp].time == None:
153
+ tmp += 1
154
+ if w.time == None:
155
+ continue
156
+ if ut.content[tmp].time == None:
157
+ # seek forward one utterance to find their start time
158
+ next_ut = doc_ut + 1
159
+ while next_ut < len(doc.content)-1 and (not isinstance(doc.content, Utterance) or doc.content[next_ut].alignment == None):
160
+ next_ut += 1
161
+ if next_ut < len(doc.content) and isinstance(doc.content, Utterance) and doc.content[next_ut].alignment:
162
+ w.time = (w.time[0], doc.content[next_ut].alignment[0])
163
+ else:
164
+ w.time = (w.time[0], w.time[0]+500) # give half a second because we don't know
165
+
166
+ # just in case, bound the time by the utterance derived timings
167
+ if ut.alignment and ut.alignment[0] != None:
168
+ w.time = (max(w.time[0], ut.alignment[0]), min(w.time[1], ut.alignment[1]))
169
+ # if we ended up with timings that don't make sense, drop it
170
+ if w.time and w.time[0] >= w.time[1]:
171
+ w.time = None
172
+
173
+ # clear any built-in timing (i.e. we should use utterance-derived timing)
174
+ ut.time = None
175
+ # correct the text
176
+ if ut.alignment and ut.text != None:
177
+ if '\x15' not in ut.text:
178
+ ut.text = (ut.text+f" \x15{ut.alignment[0]}_{ut.alignment[1]}\x15").strip()
179
+ else:
180
+ ut.text = re.sub(r"\x15\d+_\d+\x15",
181
+ f"\x15{ut.alignment[0]}_{ut.alignment[1]}\x15", ut.text).strip()
182
+ elif ut.text != None:
183
+ ut.text = re.sub(r"\x15\d+_\d+\x15", f"", ut.text).strip()
184
+
185
+ return doc
@@ -80,7 +80,8 @@ class TencentUTREngine(BatchalignEngine):
80
80
  self.__client = AsrClient(cred, "ap-hongkong")
81
81
 
82
82
 
83
- def replace_cantonese_words(self, word):
83
+ @staticmethod
84
+ def replace_cantonese_words(word):
84
85
  """Function to replace Cantonese words with custom replacements."""
85
86
  word_replacements = {
86
87
  "系": "係",
@@ -194,7 +195,7 @@ class TencentUTREngine(BatchalignEngine):
194
195
  roman_cache_end = i.StartMs
195
196
  for j in i.Words:
196
197
  word = j.Word
197
- if self.__lang == "yue":
198
+ if lang == "yue":
198
199
  word = cc.convert(word)
199
200
 
200
201
  word = self.replace_cantonese_words(word)
@@ -0,0 +1,3 @@
1
+ 0.7.23-post.1
2
+ Janurary 4th, 2026
3
+ Cantonese FA
@@ -75,7 +75,8 @@ setup(
75
75
  "pyannote.audio",
76
76
  "onnxruntime",
77
77
  "certifi>=2025.10.5",
78
- "regex"
78
+ "regex",
79
+ "pycantonese"
79
80
  ],
80
81
  extras_require={
81
82
  'dev': [
@@ -1,3 +0,0 @@
1
- 0.7.22-post.34
2
- December 30th, 2025
3
- CA