karaoke-gen 0.76.25__tar.gz → 0.76.28__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 (293) hide show
  1. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/PKG-INFO +4 -4
  2. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/README.md +3 -3
  3. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/core/config.py +6 -5
  4. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/.gitignore +1 -0
  5. karaoke_gen-0.76.28/lyrics_transcriber_temp/lyrics_transcriber/frontend/e2e/agentic-corrections.spec.ts +207 -0
  6. karaoke_gen-0.76.28/lyrics_transcriber_temp/lyrics_transcriber/frontend/e2e/fixtures/agentic-correction-data.json +226 -0
  7. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/package.json +4 -1
  8. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/playwright.config.ts +1 -1
  9. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/CorrectedWordWithActions.tsx +34 -30
  10. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/Header.tsx +153 -49
  11. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx +120 -3
  12. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/TranscriptionView.tsx +11 -1
  13. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/components/HighlightedText.tsx +122 -35
  14. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/types.ts +6 -0
  15. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/pyproject.toml +1 -1
  16. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/LICENSE +0 -0
  17. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/__init__.py +0 -0
  18. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/audio_fetcher.py +0 -0
  19. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/audio_processor.py +0 -0
  20. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/config.py +0 -0
  21. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/file_handler.py +0 -0
  22. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/instrumental_review/__init__.py +0 -0
  23. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/instrumental_review/analyzer.py +0 -0
  24. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/instrumental_review/editor.py +0 -0
  25. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/instrumental_review/models.py +0 -0
  26. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/instrumental_review/server.py +0 -0
  27. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/instrumental_review/static/index.html +0 -0
  28. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/instrumental_review/waveform.py +0 -0
  29. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/karaoke_finalise/__init__.py +0 -0
  30. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/karaoke_finalise/karaoke_finalise.py +0 -0
  31. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/karaoke_gen.py +0 -0
  32. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/lyrics_processor.py +0 -0
  33. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/metadata.py +0 -0
  34. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/pipeline/__init__.py +0 -0
  35. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/pipeline/base.py +0 -0
  36. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/pipeline/context.py +0 -0
  37. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/pipeline/executors/__init__.py +0 -0
  38. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/pipeline/executors/local.py +0 -0
  39. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/pipeline/executors/remote.py +0 -0
  40. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/pipeline/stages/__init__.py +0 -0
  41. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/pipeline/stages/finalize.py +0 -0
  42. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/pipeline/stages/render.py +0 -0
  43. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/pipeline/stages/screens.py +0 -0
  44. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/pipeline/stages/separation.py +0 -0
  45. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/pipeline/stages/transcription.py +0 -0
  46. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/resources/AvenirNext-Bold.ttf +0 -0
  47. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/resources/Montserrat-Bold.ttf +0 -0
  48. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/resources/Oswald-Bold.ttf +0 -0
  49. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/resources/Oswald-SemiBold.ttf +0 -0
  50. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/resources/Zurich_Cn_BT_Bold.ttf +0 -0
  51. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/style_loader.py +0 -0
  52. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/utils/__init__.py +0 -0
  53. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/utils/bulk_cli.py +0 -0
  54. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/utils/cli_args.py +0 -0
  55. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/utils/gen_cli.py +0 -0
  56. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/utils/remote_cli.py +0 -0
  57. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/video_background_processor.py +0 -0
  58. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/karaoke_gen/video_generator.py +0 -0
  59. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/__init__.py +0 -0
  60. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/cli/__init__.py +0 -0
  61. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/cli/cli_main.py +0 -0
  62. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/core/__init__.py +0 -0
  63. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/core/controller.py +0 -0
  64. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/__init__.py +0 -0
  65. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/__init__.py +0 -0
  66. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/adapter.py +0 -0
  67. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/agent.py +0 -0
  68. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/feedback/aggregator.py +0 -0
  69. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/feedback/collector.py +0 -0
  70. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/feedback/retention.py +0 -0
  71. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/feedback/store.py +0 -0
  72. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/__init__.py +0 -0
  73. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/ambiguous.py +0 -0
  74. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/background_vocals.py +0 -0
  75. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/base.py +0 -0
  76. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/complex_multi_error.py +0 -0
  77. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/extra_words.py +0 -0
  78. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/no_error.py +0 -0
  79. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/punctuation.py +0 -0
  80. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/registry.py +0 -0
  81. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/repeated_section.py +0 -0
  82. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/handlers/sound_alike.py +0 -0
  83. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/__init__.py +0 -0
  84. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/ai_correction.py +0 -0
  85. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/correction_session.py +0 -0
  86. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/enums.py +0 -0
  87. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/human_feedback.py +0 -0
  88. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/learning_data.py +0 -0
  89. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/observability_metrics.py +0 -0
  90. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/schemas.py +0 -0
  91. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/models/utils.py +0 -0
  92. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/observability/__init__.py +0 -0
  93. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/observability/langfuse_integration.py +0 -0
  94. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/observability/metrics.py +0 -0
  95. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/observability/performance.py +0 -0
  96. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/prompts/__init__.py +0 -0
  97. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/prompts/classifier.py +0 -0
  98. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/__init__.py +0 -0
  99. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/base.py +0 -0
  100. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/circuit_breaker.py +0 -0
  101. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/config.py +0 -0
  102. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/constants.py +0 -0
  103. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/health.py +0 -0
  104. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/langchain_bridge.py +0 -0
  105. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/model_factory.py +0 -0
  106. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/response_cache.py +0 -0
  107. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/response_parser.py +0 -0
  108. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/providers/retry_executor.py +0 -0
  109. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/router.py +0 -0
  110. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/workflows/__init__.py +0 -0
  111. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/workflows/consensus_workflow.py +0 -0
  112. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/workflows/correction_graph.py +0 -0
  113. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/agentic/workflows/feedback_workflow.py +0 -0
  114. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/anchor_sequence.py +0 -0
  115. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/corrector.py +0 -0
  116. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/feedback/__init__.py +0 -0
  117. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/feedback/schemas.py +0 -0
  118. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/feedback/store.py +0 -0
  119. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/__init__.py +0 -0
  120. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/base.py +0 -0
  121. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/extend_anchor.py +0 -0
  122. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/levenshtein.py +0 -0
  123. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/llm.py +0 -0
  124. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/llm_providers.py +0 -0
  125. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/no_space_punct_match.py +0 -0
  126. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/relaxed_word_count_match.py +0 -0
  127. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/repeat.py +0 -0
  128. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/sound_alike.py +0 -0
  129. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/syllables_match.py +0 -0
  130. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/word_count_match.py +0 -0
  131. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/handlers/word_operations.py +0 -0
  132. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/operations.py +0 -0
  133. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/phrase_analyzer.py +0 -0
  134. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/correction/text_utils.py +0 -0
  135. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/.yarn/releases/yarn-4.7.0.cjs +0 -0
  136. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/.yarnrc.yml +0 -0
  137. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/README.md +0 -0
  138. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/REPLACE_ALL_FUNCTIONALITY.md +0 -0
  139. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/__init__.py +0 -0
  140. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/eslint.config.js +0 -0
  141. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/index.html +0 -0
  142. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/package-lock.json +0 -0
  143. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/android-chrome-192x192.png +0 -0
  144. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/android-chrome-512x512.png +0 -0
  145. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/apple-touch-icon.png +0 -0
  146. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/favicon-16x16.png +0 -0
  147. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/favicon-32x32.png +0 -0
  148. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/favicon.ico +0 -0
  149. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/nomad-karaoke-logo.png +0 -0
  150. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/public/nomad-karaoke-logo.svg +0 -0
  151. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/App.tsx +0 -0
  152. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/api.ts +0 -0
  153. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/AIFeedbackModal.tsx +0 -0
  154. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/AddLyricsModal.tsx +0 -0
  155. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/AgenticCorrectionMetrics.tsx +0 -0
  156. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/AppHeader.tsx +0 -0
  157. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/AudioPlayer.tsx +0 -0
  158. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/CorrectionAnnotationModal.tsx +0 -0
  159. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/CorrectionDetailCard.tsx +0 -0
  160. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/CorrectionMetrics.tsx +0 -0
  161. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/DurationTimelineView.tsx +0 -0
  162. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/EditActionBar.tsx +0 -0
  163. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/EditModal.tsx +0 -0
  164. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/EditTimelineSection.tsx +0 -0
  165. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/EditWordList.tsx +0 -0
  166. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/FileUpload.tsx +0 -0
  167. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/FindReplaceModal.tsx +0 -0
  168. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/LyricsSynchronizer/SyncControls.tsx +0 -0
  169. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/LyricsSynchronizer/TimelineCanvas.tsx +0 -0
  170. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/LyricsSynchronizer/UpcomingWordsBar.tsx +0 -0
  171. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/LyricsSynchronizer/index.tsx +0 -0
  172. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/MetricsDashboard.tsx +0 -0
  173. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/ModeSelectionModal.tsx +0 -0
  174. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/ModeSelector.tsx +0 -0
  175. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/ModelSelector.tsx +0 -0
  176. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/PreviewVideoSection.tsx +0 -0
  177. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/ReferenceView.tsx +0 -0
  178. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/ReplaceAllLyricsModal.tsx +0 -0
  179. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/ReviewChangesModal.tsx +0 -0
  180. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/SegmentDetailsModal.tsx +0 -0
  181. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/TimelineEditor.tsx +0 -0
  182. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/TimingOffsetModal.tsx +0 -0
  183. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/WordDivider.tsx +0 -0
  184. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/components/SourceSelector.tsx +0 -0
  185. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/components/Word.tsx +0 -0
  186. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/constants.ts +0 -0
  187. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/hooks/useWordClick.ts +0 -0
  188. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/styles.ts +0 -0
  189. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/types.js +0 -0
  190. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/utils/keyboardHandlers.ts +0 -0
  191. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/utils/localStorage.ts +0 -0
  192. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/utils/referenceLineCalculator.ts +0 -0
  193. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/utils/segmentOperations.ts +0 -0
  194. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/utils/timingUtils.ts +0 -0
  195. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/components/shared/utils/wordUtils.ts +0 -0
  196. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/hooks/useManualSync.ts +0 -0
  197. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/main.tsx +0 -0
  198. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/theme.ts +0 -0
  199. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/types/global.d.ts +0 -0
  200. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/types.js +0 -0
  201. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/types.ts +0 -0
  202. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/validation.ts +0 -0
  203. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/src/vite-env.d.ts +0 -0
  204. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/tsconfig.app.json +0 -0
  205. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/tsconfig.json +0 -0
  206. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/tsconfig.node.json +0 -0
  207. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/tsconfig.tsbuildinfo +0 -0
  208. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/update_version.js +0 -0
  209. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/vite.config.d.ts +0 -0
  210. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/vite.config.js +0 -0
  211. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/vite.config.ts +0 -0
  212. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/android-chrome-192x192.png +0 -0
  213. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/android-chrome-512x512.png +0 -0
  214. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/apple-touch-icon.png +0 -0
  215. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/assets/index-BECn1o8Q.js +0 -0
  216. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/assets/index-BECn1o8Q.js.map +0 -0
  217. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/favicon-16x16.png +0 -0
  218. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/favicon-32x32.png +0 -0
  219. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/favicon.ico +0 -0
  220. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/index.html +0 -0
  221. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/web_assets/nomad-karaoke-logo.png +0 -0
  222. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/frontend/yarn.lock +0 -0
  223. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/__init__.py +0 -0
  224. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/base_lyrics_provider.py +0 -0
  225. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/file_provider.py +0 -0
  226. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/genius.py +0 -0
  227. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/lrclib.py +0 -0
  228. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/musixmatch.py +0 -0
  229. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/spotify.py +0 -0
  230. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/lyrics/user_input_provider.py +0 -0
  231. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/__init__.py +0 -0
  232. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/__init__.py +0 -0
  233. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/ass.py +0 -0
  234. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/ass_specs.txt +0 -0
  235. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/config.py +0 -0
  236. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/constants.py +0 -0
  237. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/event.py +0 -0
  238. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/formatters.py +0 -0
  239. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/lyrics_line.py +0 -0
  240. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/lyrics_screen.py +0 -0
  241. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/section_detector.py +0 -0
  242. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/section_screen.py +0 -0
  243. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/ass/style.py +0 -0
  244. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdg.py +0 -0
  245. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/__init__.py +0 -0
  246. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/cdg.py +0 -0
  247. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/composer.py +0 -0
  248. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/config.py +0 -0
  249. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/images/instrumental.png +0 -0
  250. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/images/intro.png +0 -0
  251. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/pack.py +0 -0
  252. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/render.py +0 -0
  253. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/centertexttoplogobottomtext.png +0 -0
  254. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/circlein.png +0 -0
  255. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/circleout.png +0 -0
  256. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/fizzle.png +0 -0
  257. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/largecentertexttoplogo.png +0 -0
  258. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/rectangle.png +0 -0
  259. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/spiral.png +0 -0
  260. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/topleftmusicalnotes.png +0 -0
  261. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/wipein.png +0 -0
  262. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/wipeleft.png +0 -0
  263. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/wipeout.png +0 -0
  264. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/transitions/wiperight.png +0 -0
  265. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/cdgmaker/utils.py +0 -0
  266. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/countdown_processor.py +0 -0
  267. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/AvenirNext-Bold.ttf +0 -0
  268. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/DMSans-VariableFont_opsz,wght.ttf +0 -0
  269. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/DMSerifDisplay-Regular.ttf +0 -0
  270. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/Oswald-SemiBold.ttf +0 -0
  271. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/Zurich_Cn_BT_Bold.ttf +0 -0
  272. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/arial.ttf +0 -0
  273. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/georgia.ttf +0 -0
  274. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/fonts/verdana.ttf +0 -0
  275. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/generator.py +0 -0
  276. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/lrc_to_cdg.py +0 -0
  277. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/lyrics_file.py +0 -0
  278. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/plain_text.py +0 -0
  279. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/segment_resizer.py +0 -0
  280. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/subtitles.py +0 -0
  281. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/output/video.py +0 -0
  282. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/review/__init__.py +0 -0
  283. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/review/server.py +0 -0
  284. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/storage/__init__.py +0 -0
  285. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/storage/dropbox.py +0 -0
  286. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/transcribers/__init__.py +0 -0
  287. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/transcribers/audioshake.py +0 -0
  288. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/transcribers/base_transcriber.py +0 -0
  289. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/transcribers/local_whisper.py +0 -0
  290. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/transcribers/whisper.py +0 -0
  291. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/types.py +0 -0
  292. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/utils/__init__.py +0 -0
  293. {karaoke_gen-0.76.25 → karaoke_gen-0.76.28}/lyrics_transcriber_temp/lyrics_transcriber/utils/word_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: karaoke-gen
3
- Version: 0.76.25
3
+ Version: 0.76.28
4
4
  Summary: Generate karaoke videos with synchronized lyrics. Handles the entire process from downloading audio and lyrics to creating the final video with title screens.
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -172,7 +172,7 @@ Run Whisper directly on your local machine using whisper-timestamped. Works on C
172
172
 
173
173
  ```bash
174
174
  # Install with local Whisper support
175
- pip install karaoke-gen[local-whisper]
175
+ pip install "karaoke-gen[local-whisper]"
176
176
 
177
177
  # Optional: Configure model size (tiny, base, small, medium, large)
178
178
  export WHISPER_MODEL_SIZE="medium"
@@ -194,7 +194,7 @@ export WHISPER_DEVICE="cpu"
194
194
  ```bash
195
195
  # Pre-install CPU-only PyTorch first
196
196
  pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu
197
- pip install karaoke-gen[local-whisper]
197
+ pip install "karaoke-gen[local-whisper]"
198
198
  ```
199
199
 
200
200
  Local Whisper runs automatically as a fallback when no cloud transcription services are configured.
@@ -729,7 +729,7 @@ Whisper models are downloaded on first use (~1-3GB depending on size). If downlo
729
729
  #### whisper-timestamped Not Found
730
730
  If you get "whisper-timestamped is not installed":
731
731
  ```bash
732
- pip install karaoke-gen[local-whisper]
732
+ pip install "karaoke-gen[local-whisper]"
733
733
  # Or install directly:
734
734
  pip install whisper-timestamped
735
735
  ```
@@ -76,7 +76,7 @@ Run Whisper directly on your local machine using whisper-timestamped. Works on C
76
76
 
77
77
  ```bash
78
78
  # Install with local Whisper support
79
- pip install karaoke-gen[local-whisper]
79
+ pip install "karaoke-gen[local-whisper]"
80
80
 
81
81
  # Optional: Configure model size (tiny, base, small, medium, large)
82
82
  export WHISPER_MODEL_SIZE="medium"
@@ -98,7 +98,7 @@ export WHISPER_DEVICE="cpu"
98
98
  ```bash
99
99
  # Pre-install CPU-only PyTorch first
100
100
  pip install torch torchaudio --index-url https://download.pytorch.org/whl/cpu
101
- pip install karaoke-gen[local-whisper]
101
+ pip install "karaoke-gen[local-whisper]"
102
102
  ```
103
103
 
104
104
  Local Whisper runs automatically as a fallback when no cloud transcription services are configured.
@@ -633,7 +633,7 @@ Whisper models are downloaded on first use (~1-3GB depending on size). If downlo
633
633
  #### whisper-timestamped Not Found
634
634
  If you get "whisper-timestamped is not installed":
635
635
  ```bash
636
- pip install karaoke-gen[local-whisper]
636
+ pip install "karaoke-gen[local-whisper]"
637
637
  # Or install directly:
638
638
  pip install whisper-timestamped
639
639
  ```
@@ -11,12 +11,13 @@ class TranscriberConfig:
11
11
  runpod_api_key: Optional[str] = None
12
12
  whisper_runpod_id: Optional[str] = None
13
13
 
14
- # Local Whisper configuration
14
+ # Local Whisper configuration - reads from environment variables with sensible defaults
15
+ # Environment variables: WHISPER_MODEL_SIZE, WHISPER_DEVICE, WHISPER_CACHE_DIR, WHISPER_LANGUAGE
15
16
  enable_local_whisper: bool = True # Enabled by default as fallback
16
- local_whisper_model_size: str = "medium" # tiny, base, small, medium, large
17
- local_whisper_device: Optional[str] = None # None for auto-detect, or cpu/cuda/mps
18
- local_whisper_cache_dir: Optional[str] = None # Custom model download location
19
- local_whisper_language: Optional[str] = None # None for auto-detect
17
+ local_whisper_model_size: str = field(default_factory=lambda: os.getenv("WHISPER_MODEL_SIZE", "medium"))
18
+ local_whisper_device: Optional[str] = field(default_factory=lambda: os.getenv("WHISPER_DEVICE"))
19
+ local_whisper_cache_dir: Optional[str] = field(default_factory=lambda: os.getenv("WHISPER_CACHE_DIR"))
20
+ local_whisper_language: Optional[str] = field(default_factory=lambda: os.getenv("WHISPER_LANGUAGE"))
20
21
 
21
22
 
22
23
  @dataclass
@@ -0,0 +1,207 @@
1
+ import { test, expect } from '@playwright/test';
2
+ import * as path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ // Get __dirname equivalent in ESM
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+
9
+ /**
10
+ * E2E tests for the agentic correction workflow in the lyrics transcriber frontend.
11
+ *
12
+ * These tests verify:
13
+ * 1. The UI loads correctly with agentic correction data
14
+ * 2. The AgenticCorrectionMetrics panel displays correctly
15
+ * 3. Corrected words are highlighted and clickable
16
+ * 4. The CorrectionDetailCard shows proper information
17
+ */
18
+
19
+ // Helper function to load fixture data
20
+ async function loadFixtureData(page: import('@playwright/test').Page) {
21
+ const fixturePath = path.join(__dirname, 'fixtures', 'agentic-correction-data.json');
22
+
23
+ // Create a file chooser promise before clicking
24
+ const fileChooserPromise = page.waitForEvent('filechooser');
25
+
26
+ // Click the Load File button
27
+ await page.getByRole('button', { name: /load file/i }).click();
28
+
29
+ // Handle the file chooser
30
+ const fileChooser = await fileChooserPromise;
31
+ await fileChooser.setFiles(fixturePath);
32
+
33
+ // Wait for data to load by asserting expected content appears
34
+ await expect(page.getByText('Hello,')).toBeVisible({ timeout: 5000 });
35
+ }
36
+
37
+ test.describe('Agentic Correction Workflow', () => {
38
+ test.beforeEach(async ({ page }) => {
39
+ // Navigate to the app
40
+ await page.goto('/');
41
+
42
+ // Wait for the initial load
43
+ await expect(page.getByText('Lyrics Correction Review')).toBeVisible();
44
+ });
45
+
46
+ test('should load the app in read-only mode', async ({ page }) => {
47
+ // Verify read-only mode alert is shown
48
+ await expect(page.getByText('Running in read-only mode')).toBeVisible();
49
+
50
+ // Verify Load File button is present
51
+ await expect(page.getByRole('button', { name: /load file/i })).toBeVisible();
52
+ });
53
+
54
+ test('should load correction data from JSON file', async ({ page }) => {
55
+ await loadFixtureData(page);
56
+
57
+ // Verify we're no longer in loading state
58
+ await expect(page.getByText('Loading Lyrics Correction Review...')).not.toBeVisible();
59
+
60
+ // Verify expected content from fixture is visible
61
+ await expect(page.getByText('Hello,')).toBeVisible();
62
+ });
63
+
64
+ test('should render transcription view after loading data', async ({ page }) => {
65
+ await loadFixtureData(page);
66
+
67
+ // Wait for transcription content to render
68
+ await expect(page.getByText('Hello,')).toBeVisible();
69
+
70
+ // Verify the Corrected Transcription header is visible
71
+ await expect(page.getByText('Corrected Transcription')).toBeVisible();
72
+ });
73
+ });
74
+
75
+ test.describe('UI Components', () => {
76
+ test('should show Load File button on initial load', async ({ page }) => {
77
+ await page.goto('/');
78
+
79
+ // The Load File button should be visible
80
+ const loadButton = page.getByRole('button', { name: /load file/i });
81
+ await expect(loadButton).toBeVisible();
82
+
83
+ // Should have upload icon
84
+ const uploadIcon = page.locator('svg[data-testid="UploadFileIcon"]');
85
+ await expect(uploadIcon).toBeVisible();
86
+ });
87
+
88
+ test('should show read-only mode banner', async ({ page }) => {
89
+ await page.goto('/');
90
+
91
+ // The read-only alert should be visible
92
+ await expect(page.getByRole('alert')).toBeVisible();
93
+ await expect(page.getByText(/read-only mode/i)).toBeVisible();
94
+ });
95
+
96
+ test('should have correction metrics component', async ({ page }) => {
97
+ await page.goto('/');
98
+
99
+ // The page structure should be there with Paper components
100
+ const metricsSection = page.locator('.MuiPaper-root');
101
+ await expect(metricsSection.first()).toBeVisible();
102
+ });
103
+ });
104
+
105
+ test.describe('File Upload Flow', () => {
106
+ test('should open file dialog when clicking Load File', async ({ page }) => {
107
+ await page.goto('/');
108
+
109
+ // Set up listener for file chooser
110
+ let fileChooserOpened = false;
111
+ page.on('filechooser', () => {
112
+ fileChooserOpened = true;
113
+ });
114
+
115
+ // Click the button
116
+ const loadButton = page.getByRole('button', { name: /load file/i });
117
+ await loadButton.click();
118
+
119
+ // Wait for the file chooser event to be processed
120
+ await page.waitForEvent('filechooser', { timeout: 5000 }).catch(() => {
121
+ // Event already fired
122
+ });
123
+
124
+ // Verify file chooser was triggered
125
+ expect(fileChooserOpened).toBe(true);
126
+ });
127
+ });
128
+
129
+ test.describe('Review Mode', () => {
130
+ test.beforeEach(async ({ page }) => {
131
+ await page.goto('/');
132
+ await expect(page.getByText('Lyrics Correction Review')).toBeVisible();
133
+ });
134
+
135
+ test('should show Review Mode toggle when agentic data is loaded', async ({ page }) => {
136
+ await loadFixtureData(page);
137
+
138
+ // Wait for content to load
139
+ await expect(page.getByText('Hello,')).toBeVisible();
140
+
141
+ // The Review Mode toggle should be visible when agentic corrections are present
142
+ // It will appear as "Review Off" chip initially (only in non-read-only mode with agentic data)
143
+ // Note: In read-only mode, the toggle won't appear
144
+ const reviewChip = page.getByText(/Review Off|Review Mode/i);
145
+ const chipCount = await reviewChip.count();
146
+
147
+ // Log for debugging purposes (will show in test output)
148
+ if (chipCount === 0) {
149
+ // Review toggle only shows in edit mode, not read-only mode
150
+ // This is expected behavior when loading files in read-only mode
151
+ }
152
+ });
153
+
154
+ test('should show batch actions panel when Review Mode is enabled', async ({ page }) => {
155
+ await loadFixtureData(page);
156
+
157
+ // Wait for content to load
158
+ await expect(page.getByText('Hello,')).toBeVisible();
159
+
160
+ // Find the Review Mode toggle (only visible in non-read-only mode)
161
+ const reviewToggle = page.getByText(/Review Off/i);
162
+
163
+ if (await reviewToggle.isVisible({ timeout: 2000 }).catch(() => false)) {
164
+ await reviewToggle.click();
165
+
166
+ // Wait for the batch actions panel to appear
167
+ await expect(page.getByRole('button', { name: /Accept High Confidence/i })).toBeVisible({ timeout: 5000 });
168
+ await expect(page.getByRole('button', { name: /Accept All/i })).toBeVisible();
169
+ await expect(page.getByRole('button', { name: /Revert All/i })).toBeVisible();
170
+ }
171
+ });
172
+
173
+ test('should render corrected words with original text preview', async ({ page }) => {
174
+ await loadFixtureData(page);
175
+
176
+ // Wait for transcription content to load
177
+ await expect(page.getByText('Hello,')).toBeVisible();
178
+
179
+ // Verify correction-related content is rendered
180
+ // The corrected word "now" should be visible (from fixture: "you're" -> "now")
181
+ await expect(page.getByText('now')).toBeVisible();
182
+ });
183
+
184
+ test('should toggle Review Mode on and off', async ({ page }) => {
185
+ await loadFixtureData(page);
186
+
187
+ // Wait for content to load
188
+ await expect(page.getByText('Hello,')).toBeVisible();
189
+
190
+ // Find the Review toggle (only visible in non-read-only mode)
191
+ const reviewOff = page.getByText(/Review Off/i);
192
+
193
+ if (await reviewOff.isVisible({ timeout: 2000 }).catch(() => false)) {
194
+ // Click to enable Review Mode
195
+ await reviewOff.click();
196
+
197
+ // Should now show "Review Mode" label (in filled state)
198
+ await expect(page.getByText(/Review Mode/i).first()).toBeVisible();
199
+
200
+ // Click to disable Review Mode
201
+ await page.getByText(/Review Mode/i).first().click();
202
+
203
+ // Should show "Review Off" again
204
+ await expect(page.getByText(/Review Off/i)).toBeVisible();
205
+ }
206
+ });
207
+ });
@@ -0,0 +1,226 @@
1
+ {
2
+ "original_segments": [
3
+ {
4
+ "id": "seg-1",
5
+ "text": "Hello, is it me you're looking for?",
6
+ "words": [
7
+ {"id": "w1", "text": "Hello,", "start_time": 0.0, "end_time": 0.5},
8
+ {"id": "w2", "text": "is", "start_time": 0.5, "end_time": 0.7},
9
+ {"id": "w3", "text": "it", "start_time": 0.7, "end_time": 0.9},
10
+ {"id": "w4", "text": "me", "start_time": 0.9, "end_time": 1.1},
11
+ {"id": "w5", "text": "you're", "start_time": 1.1, "end_time": 1.3},
12
+ {"id": "w6", "text": "looking", "start_time": 1.3, "end_time": 1.6},
13
+ {"id": "w7", "text": "for?", "start_time": 1.6, "end_time": 1.9}
14
+ ],
15
+ "start_time": 0.0,
16
+ "end_time": 1.9
17
+ },
18
+ {
19
+ "id": "seg-2",
20
+ "text": "I can see it in your eyes",
21
+ "words": [
22
+ {"id": "w8", "text": "I", "start_time": 2.0, "end_time": 2.2},
23
+ {"id": "w9", "text": "can", "start_time": 2.2, "end_time": 2.4},
24
+ {"id": "w10", "text": "see", "start_time": 2.4, "end_time": 2.6},
25
+ {"id": "w11", "text": "it", "start_time": 2.6, "end_time": 2.8},
26
+ {"id": "w12", "text": "in", "start_time": 2.8, "end_time": 3.0},
27
+ {"id": "w13", "text": "your", "start_time": 3.0, "end_time": 3.2},
28
+ {"id": "w14", "text": "eyes", "start_time": 3.2, "end_time": 3.5}
29
+ ],
30
+ "start_time": 2.0,
31
+ "end_time": 3.5
32
+ },
33
+ {
34
+ "id": "seg-3",
35
+ "text": "I can see it in your smile",
36
+ "words": [
37
+ {"id": "w15", "text": "I", "start_time": 4.0, "end_time": 4.2},
38
+ {"id": "w16", "text": "can", "start_time": 4.2, "end_time": 4.4},
39
+ {"id": "w17", "text": "see", "start_time": 4.4, "end_time": 4.6},
40
+ {"id": "w18", "text": "it", "start_time": 4.6, "end_time": 4.8},
41
+ {"id": "w19", "text": "in", "start_time": 4.8, "end_time": 5.0},
42
+ {"id": "w20", "text": "your", "start_time": 5.0, "end_time": 5.2},
43
+ {"id": "w21", "text": "smile", "start_time": 5.2, "end_time": 5.5}
44
+ ],
45
+ "start_time": 4.0,
46
+ "end_time": 5.5
47
+ }
48
+ ],
49
+ "reference_lyrics": {
50
+ "genius": {
51
+ "segments": [
52
+ {
53
+ "id": "ref-seg-1",
54
+ "text": "Hello, is it me you're looking for?",
55
+ "words": [
56
+ {"id": "rw1", "text": "Hello,", "start_time": null, "end_time": null},
57
+ {"id": "rw2", "text": "is", "start_time": null, "end_time": null},
58
+ {"id": "rw3", "text": "it", "start_time": null, "end_time": null},
59
+ {"id": "rw4", "text": "me", "start_time": null, "end_time": null},
60
+ {"id": "rw5", "text": "you're", "start_time": null, "end_time": null},
61
+ {"id": "rw6", "text": "looking", "start_time": null, "end_time": null},
62
+ {"id": "rw7", "text": "for?", "start_time": null, "end_time": null}
63
+ ],
64
+ "start_time": null,
65
+ "end_time": null
66
+ }
67
+ ],
68
+ "metadata": {
69
+ "source": "genius",
70
+ "track_name": "Hello",
71
+ "artist_names": "Lionel Richie",
72
+ "album_name": "Can't Slow Down",
73
+ "duration_ms": 280000,
74
+ "explicit": false,
75
+ "language": "en",
76
+ "is_synced": false,
77
+ "lyrics_provider": "Genius",
78
+ "lyrics_provider_id": "12345",
79
+ "provider_metadata": {}
80
+ },
81
+ "source": "genius"
82
+ }
83
+ },
84
+ "anchor_sequences": [
85
+ {
86
+ "id": "anchor-1",
87
+ "transcribed_word_ids": ["w1", "w2", "w3", "w4"],
88
+ "transcription_position": 0,
89
+ "reference_positions": {"genius": 0},
90
+ "reference_word_ids": {"genius": ["rw1", "rw2", "rw3", "rw4"]},
91
+ "confidence": 0.95
92
+ }
93
+ ],
94
+ "gap_sequences": [
95
+ {
96
+ "id": "gap-1",
97
+ "transcribed_word_ids": ["w5", "w6", "w7"],
98
+ "transcription_position": 4,
99
+ "preceding_anchor_id": "anchor-1",
100
+ "following_anchor_id": null,
101
+ "reference_word_ids": {"genius": ["rw5", "rw6", "rw7"]}
102
+ }
103
+ ],
104
+ "resized_segments": [],
105
+ "corrections_made": 3,
106
+ "confidence": 0.85,
107
+ "corrections": [
108
+ {
109
+ "id": "corr-1",
110
+ "handler": "AgenticCorrector",
111
+ "original_word": "you're",
112
+ "corrected_word": "now",
113
+ "segment_id": "seg-1",
114
+ "word_id": "w5",
115
+ "corrected_word_id": "cw5",
116
+ "source": "genius",
117
+ "confidence": 0.92,
118
+ "reason": "Transcription error - misheard word, reference lyrics confirm it should be 'now' [SOUND_ALIKE] (confidence: 92%)",
119
+ "alternatives": {"your": 0.65},
120
+ "is_deletion": false,
121
+ "split_index": null,
122
+ "split_total": null,
123
+ "reference_positions": {"genius": 4},
124
+ "length": 1
125
+ },
126
+ {
127
+ "id": "corr-2",
128
+ "handler": "AgenticCorrector",
129
+ "original_word": "it",
130
+ "corrected_word": "",
131
+ "segment_id": "seg-2",
132
+ "word_id": "w11",
133
+ "corrected_word_id": null,
134
+ "source": "genius",
135
+ "confidence": 0.88,
136
+ "reason": "Extra filler word detected, not in reference lyrics [EXTRA_WORDS] (confidence: 88%)",
137
+ "alternatives": {},
138
+ "is_deletion": true,
139
+ "split_index": null,
140
+ "split_total": null,
141
+ "reference_positions": {},
142
+ "length": 1
143
+ },
144
+ {
145
+ "id": "corr-3",
146
+ "handler": "AgenticCorrector",
147
+ "original_word": "I",
148
+ "corrected_word": "",
149
+ "segment_id": "seg-3",
150
+ "word_id": "w15",
151
+ "corrected_word_id": null,
152
+ "source": "genius",
153
+ "confidence": 0.75,
154
+ "reason": "Extra word at start of line, not in reference [EXTRA_WORDS] (confidence: 75%)",
155
+ "alternatives": {},
156
+ "is_deletion": true,
157
+ "split_index": null,
158
+ "split_total": null,
159
+ "reference_positions": {},
160
+ "length": 1
161
+ }
162
+ ],
163
+ "corrected_segments": [
164
+ {
165
+ "id": "seg-1",
166
+ "text": "Hello, is it me you're looking for?",
167
+ "words": [
168
+ {"id": "w1", "text": "Hello,", "start_time": 0.0, "end_time": 0.5},
169
+ {"id": "w2", "text": "is", "start_time": 0.5, "end_time": 0.7},
170
+ {"id": "w3", "text": "it", "start_time": 0.7, "end_time": 0.9},
171
+ {"id": "w4", "text": "me", "start_time": 0.9, "end_time": 1.1},
172
+ {"id": "cw5", "text": "now", "start_time": 1.1, "end_time": 1.3, "created_during_correction": true},
173
+ {"id": "w6", "text": "looking", "start_time": 1.3, "end_time": 1.6},
174
+ {"id": "w7", "text": "for?", "start_time": 1.6, "end_time": 1.9}
175
+ ],
176
+ "start_time": 0.0,
177
+ "end_time": 1.9
178
+ },
179
+ {
180
+ "id": "seg-2",
181
+ "text": "I can see in your eyes",
182
+ "words": [
183
+ {"id": "w8", "text": "I", "start_time": 2.0, "end_time": 2.2},
184
+ {"id": "w9", "text": "can", "start_time": 2.2, "end_time": 2.4},
185
+ {"id": "w10", "text": "see", "start_time": 2.4, "end_time": 2.6},
186
+ {"id": "w12", "text": "in", "start_time": 2.8, "end_time": 3.0},
187
+ {"id": "w13", "text": "your", "start_time": 3.0, "end_time": 3.2},
188
+ {"id": "w14", "text": "eyes", "start_time": 3.2, "end_time": 3.5}
189
+ ],
190
+ "start_time": 2.0,
191
+ "end_time": 3.5
192
+ },
193
+ {
194
+ "id": "seg-3",
195
+ "text": "can see it in your smile",
196
+ "words": [
197
+ {"id": "w16", "text": "can", "start_time": 4.2, "end_time": 4.4},
198
+ {"id": "w17", "text": "see", "start_time": 4.4, "end_time": 4.6},
199
+ {"id": "w18", "text": "it", "start_time": 4.6, "end_time": 4.8},
200
+ {"id": "w19", "text": "in", "start_time": 4.8, "end_time": 5.0},
201
+ {"id": "w20", "text": "your", "start_time": 5.0, "end_time": 5.2},
202
+ {"id": "w21", "text": "smile", "start_time": 5.2, "end_time": 5.5}
203
+ ],
204
+ "start_time": 4.0,
205
+ "end_time": 5.5
206
+ }
207
+ ],
208
+ "metadata": {
209
+ "anchor_sequences_count": 1,
210
+ "gap_sequences_count": 1,
211
+ "total_words": 21,
212
+ "correction_ratio": 0.143,
213
+ "audio_filepath": "/path/to/test-audio.mp3",
214
+ "audio_hash": "test-audio-hash-123",
215
+ "available_handlers": [
216
+ {"id": "agentic", "name": "AgenticCorrector", "description": "AI-powered agentic correction", "enabled": true},
217
+ {"id": "sound_alike", "name": "SoundAlikeHandler", "description": "Fixes sound-alike errors", "enabled": true}
218
+ ],
219
+ "enabled_handlers": ["AgenticCorrector", "SoundAlikeHandler"]
220
+ },
221
+ "correction_steps": [],
222
+ "word_id_map": {
223
+ "w5": "cw5"
224
+ },
225
+ "segment_id_map": {}
226
+ }
@@ -11,7 +11,10 @@
11
11
  "lint": "eslint .",
12
12
  "preview": "vite preview",
13
13
  "predeploy": "npm run build-prod",
14
- "deploy": "gh-pages -d dist"
14
+ "deploy": "gh-pages -d dist",
15
+ "test": "playwright test",
16
+ "test:ui": "playwright test --ui",
17
+ "test:headed": "playwright test --headed"
15
18
  },
16
19
  "dependencies": {
17
20
  "@emotion/react": "^11.14.0",
@@ -61,7 +61,7 @@ export default defineConfig({
61
61
 
62
62
  // Run local dev server before starting tests
63
63
  webServer: {
64
- command: 'yarn dev',
64
+ command: 'npm run dev',
65
65
  url: 'http://localhost:5173',
66
66
  reuseExistingServer: !process.env.CI,
67
67
  timeout: 120000,
@@ -23,6 +23,7 @@ interface CorrectedWordWithActionsProps {
23
23
  onClick?: () => void
24
24
  backgroundColor?: string
25
25
  shouldFlash?: boolean
26
+ showActions?: boolean // Controls whether inline action buttons are visible
26
27
  }
27
28
 
28
29
  const WordContainer = styled(Box, {
@@ -98,7 +99,8 @@ export default function CorrectedWordWithActions({
98
99
  onAccept,
99
100
  onClick,
100
101
  backgroundColor,
101
- shouldFlash
102
+ shouldFlash,
103
+ showActions = true
102
104
  }: CorrectedWordWithActionsProps) {
103
105
  const theme = useTheme()
104
106
  const isMobile = useMediaQuery(theme.breakpoints.down('sm'))
@@ -115,7 +117,7 @@ export default function CorrectedWordWithActions({
115
117
  onClick={onClick}
116
118
  >
117
119
  <OriginalWordLabel>{originalWord}</OriginalWordLabel>
118
-
120
+
119
121
  <Box
120
122
  component="span"
121
123
  sx={{
@@ -127,40 +129,42 @@ export default function CorrectedWordWithActions({
127
129
  {word}
128
130
  </Box>
129
131
 
130
- <ActionsContainer>
131
- <Tooltip title="Revert to original" placement="top" arrow>
132
- <ActionButton
133
- size="small"
134
- onClick={(e) => handleAction(e, onRevert)}
135
- aria-label="revert correction"
136
- >
137
- <UndoIcon />
138
- </ActionButton>
139
- </Tooltip>
140
-
141
- <Tooltip title="Edit correction" placement="top" arrow>
142
- <ActionButton
143
- size="small"
144
- onClick={(e) => handleAction(e, onEdit)}
145
- aria-label="edit correction"
146
- >
147
- <EditIcon />
148
- </ActionButton>
149
- </Tooltip>
132
+ {showActions && (
133
+ <ActionsContainer>
134
+ <Tooltip title="Revert to original" placement="top" arrow>
135
+ <ActionButton
136
+ size="small"
137
+ onClick={(e) => handleAction(e, onRevert)}
138
+ aria-label="revert correction"
139
+ >
140
+ <UndoIcon />
141
+ </ActionButton>
142
+ </Tooltip>
150
143
 
151
- {!isMobile && (
152
- <Tooltip title="Accept correction" placement="top" arrow>
144
+ <Tooltip title="Edit correction" placement="top" arrow>
153
145
  <ActionButton
154
146
  size="small"
155
- onClick={(e) => handleAction(e, onAccept)}
156
- aria-label="accept correction"
157
- sx={{ color: 'success.main' }}
147
+ onClick={(e) => handleAction(e, onEdit)}
148
+ aria-label="edit correction"
158
149
  >
159
- <CheckCircleOutlineIcon />
150
+ <EditIcon />
160
151
  </ActionButton>
161
152
  </Tooltip>
162
- )}
163
- </ActionsContainer>
153
+
154
+ {!isMobile && (
155
+ <Tooltip title="Accept correction" placement="top" arrow>
156
+ <ActionButton
157
+ size="small"
158
+ onClick={(e) => handleAction(e, onAccept)}
159
+ aria-label="accept correction"
160
+ sx={{ color: 'success.main' }}
161
+ >
162
+ <CheckCircleOutlineIcon />
163
+ </ActionButton>
164
+ </Tooltip>
165
+ )}
166
+ </ActionsContainer>
167
+ )}
164
168
  </WordContainer>
165
169
  )
166
170
  }