lyrics-transcriber 0.43.0__py3-none-any.whl → 0.44.0__py3-none-any.whl
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.
- lyrics_transcriber/core/controller.py +58 -24
- lyrics_transcriber/correction/anchor_sequence.py +22 -8
- lyrics_transcriber/correction/corrector.py +47 -3
- lyrics_transcriber/correction/handlers/llm.py +15 -12
- lyrics_transcriber/correction/handlers/llm_providers.py +60 -0
- lyrics_transcriber/frontend/.yarn/install-state.gz +0 -0
- lyrics_transcriber/frontend/dist/assets/{index-D0Gr3Ep7.js → index-DVoI6Z16.js} +10799 -7490
- lyrics_transcriber/frontend/dist/assets/index-DVoI6Z16.js.map +1 -0
- lyrics_transcriber/frontend/dist/index.html +1 -1
- lyrics_transcriber/frontend/src/App.tsx +4 -4
- lyrics_transcriber/frontend/src/api.ts +37 -0
- lyrics_transcriber/frontend/src/components/AddLyricsModal.tsx +114 -0
- lyrics_transcriber/frontend/src/components/AudioPlayer.tsx +14 -10
- lyrics_transcriber/frontend/src/components/CorrectionMetrics.tsx +62 -56
- lyrics_transcriber/frontend/src/components/EditModal.tsx +232 -237
- lyrics_transcriber/frontend/src/components/FindReplaceModal.tsx +467 -0
- lyrics_transcriber/frontend/src/components/GlobalSyncEditor.tsx +675 -0
- lyrics_transcriber/frontend/src/components/Header.tsx +141 -101
- lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx +146 -80
- lyrics_transcriber/frontend/src/components/ModeSelector.tsx +22 -13
- lyrics_transcriber/frontend/src/components/PreviewVideoSection.tsx +1 -0
- lyrics_transcriber/frontend/src/components/ReferenceView.tsx +29 -12
- lyrics_transcriber/frontend/src/components/ReviewChangesModal.tsx +21 -4
- lyrics_transcriber/frontend/src/components/TimelineEditor.tsx +29 -15
- lyrics_transcriber/frontend/src/components/TranscriptionView.tsx +34 -16
- lyrics_transcriber/frontend/src/components/WordDivider.tsx +186 -0
- lyrics_transcriber/frontend/src/components/shared/components/HighlightedText.tsx +89 -41
- lyrics_transcriber/frontend/src/components/shared/components/SourceSelector.tsx +9 -2
- lyrics_transcriber/frontend/src/components/shared/components/Word.tsx +28 -3
- lyrics_transcriber/frontend/src/components/shared/types.ts +17 -2
- lyrics_transcriber/frontend/src/components/shared/utils/keyboardHandlers.ts +63 -14
- lyrics_transcriber/frontend/src/components/shared/utils/segmentOperations.ts +192 -0
- lyrics_transcriber/frontend/src/hooks/useManualSync.ts +267 -0
- lyrics_transcriber/frontend/src/main.tsx +7 -1
- lyrics_transcriber/frontend/src/theme.ts +177 -0
- lyrics_transcriber/frontend/src/types.ts +1 -1
- lyrics_transcriber/frontend/tsconfig.tsbuildinfo +1 -1
- lyrics_transcriber/lyrics/base_lyrics_provider.py +2 -2
- lyrics_transcriber/lyrics/user_input_provider.py +44 -0
- lyrics_transcriber/output/generator.py +40 -12
- lyrics_transcriber/output/video.py +18 -8
- lyrics_transcriber/review/server.py +238 -8
- {lyrics_transcriber-0.43.0.dist-info → lyrics_transcriber-0.44.0.dist-info}/METADATA +3 -2
- {lyrics_transcriber-0.43.0.dist-info → lyrics_transcriber-0.44.0.dist-info}/RECORD +47 -41
- lyrics_transcriber/frontend/dist/assets/index-D0Gr3Ep7.js.map +0 -1
- lyrics_transcriber/frontend/src/components/DetailsModal.tsx +0 -252
- lyrics_transcriber/frontend/src/components/WordEditControls.tsx +0 -110
- {lyrics_transcriber-0.43.0.dist-info → lyrics_transcriber-0.44.0.dist-info}/LICENSE +0 -0
- {lyrics_transcriber-0.43.0.dist-info → lyrics_transcriber-0.44.0.dist-info}/WHEEL +0 -0
- {lyrics_transcriber-0.43.0.dist-info → lyrics_transcriber-0.44.0.dist-info}/entry_points.txt +0 -0
@@ -2,8 +2,8 @@ import logging
|
|
2
2
|
import socket
|
3
3
|
from fastapi import FastAPI, Body, HTTPException
|
4
4
|
from fastapi.middleware.cors import CORSMiddleware
|
5
|
-
from typing import Dict, Any, List
|
6
|
-
from lyrics_transcriber.types import CorrectionResult, WordCorrection, LyricsSegment
|
5
|
+
from typing import Dict, Any, List, Optional
|
6
|
+
from lyrics_transcriber.types import CorrectionResult, WordCorrection, LyricsSegment, LyricsData, LyricsMetadata, Word
|
7
7
|
import time
|
8
8
|
import os
|
9
9
|
import urllib.parse
|
@@ -18,6 +18,7 @@ from lyrics_transcriber.output.generator import OutputGenerator
|
|
18
18
|
import json
|
19
19
|
from lyrics_transcriber.correction.corrector import LyricsCorrector
|
20
20
|
from lyrics_transcriber.types import TranscriptionResult, TranscriptionData
|
21
|
+
from lyrics_transcriber.lyrics.user_input_provider import UserInputProvider
|
21
22
|
|
22
23
|
|
23
24
|
class ReviewServer:
|
@@ -73,6 +74,7 @@ class ReviewServer:
|
|
73
74
|
self.app.add_api_route("/api/audio/{audio_hash}", self.get_audio, methods=["GET"])
|
74
75
|
self.app.add_api_route("/api/ping", self.ping, methods=["GET"])
|
75
76
|
self.app.add_api_route("/api/handlers", self.update_handlers, methods=["POST"])
|
77
|
+
self.app.add_api_route("/api/add-lyrics", self.add_lyrics, methods=["POST"])
|
76
78
|
|
77
79
|
async def get_correction_data(self):
|
78
80
|
"""Get the correction data."""
|
@@ -83,8 +85,8 @@ class ReviewServer:
|
|
83
85
|
return CorrectionResult(
|
84
86
|
corrections=[
|
85
87
|
WordCorrection(
|
86
|
-
original_word=c.get("original_word", ""),
|
87
|
-
corrected_word=c.get("corrected_word", ""),
|
88
|
+
original_word=c.get("original_word", "").strip(),
|
89
|
+
corrected_word=c.get("corrected_word", "").strip(),
|
88
90
|
original_position=c.get("original_position", 0),
|
89
91
|
source=c.get("source", "review"),
|
90
92
|
reason=c.get("reason", "manual_review"),
|
@@ -103,7 +105,26 @@ class ReviewServer:
|
|
103
105
|
)
|
104
106
|
for c in updated_data["corrections"]
|
105
107
|
],
|
106
|
-
corrected_segments=[
|
108
|
+
corrected_segments=[
|
109
|
+
LyricsSegment(
|
110
|
+
id=s["id"],
|
111
|
+
text=s["text"].strip(),
|
112
|
+
words=[
|
113
|
+
Word(
|
114
|
+
id=w["id"],
|
115
|
+
text=w["text"].strip(),
|
116
|
+
start_time=w["start_time"],
|
117
|
+
end_time=w["end_time"],
|
118
|
+
confidence=w.get("confidence"),
|
119
|
+
created_during_correction=w.get("created_during_correction", False),
|
120
|
+
)
|
121
|
+
for w in s["words"]
|
122
|
+
],
|
123
|
+
start_time=s["start_time"],
|
124
|
+
end_time=s["end_time"],
|
125
|
+
)
|
126
|
+
for s in updated_data["corrected_segments"]
|
127
|
+
],
|
107
128
|
# Copy existing fields from the base result
|
108
129
|
original_segments=base_result.original_segments,
|
109
130
|
corrections_made=len(updated_data["corrections"]),
|
@@ -166,7 +187,7 @@ class ReviewServer:
|
|
166
187
|
styles=self.output_config.styles,
|
167
188
|
max_line_length=self.output_config.max_line_length,
|
168
189
|
)
|
169
|
-
output_generator = OutputGenerator(config=preview_config, logger=self.logger)
|
190
|
+
output_generator = OutputGenerator(config=preview_config, logger=self.logger, preview_mode=True)
|
170
191
|
|
171
192
|
# Generate preview outputs with unique prefix
|
172
193
|
preview_outputs = output_generator.generate_outputs(
|
@@ -174,7 +195,6 @@ class ReviewServer:
|
|
174
195
|
lyrics_results={}, # Empty dict since we don't need lyrics results for preview
|
175
196
|
output_prefix=f"preview_{preview_hash}", # Include hash in filename
|
176
197
|
audio_filepath=self.audio_filepath,
|
177
|
-
preview_mode=True,
|
178
198
|
)
|
179
199
|
|
180
200
|
if not preview_outputs.video:
|
@@ -238,13 +258,58 @@ class ReviewServer:
|
|
238
258
|
source="original",
|
239
259
|
)
|
240
260
|
|
241
|
-
#
|
261
|
+
# Get currently enabled handlers from metadata
|
262
|
+
enabled_handlers = None
|
263
|
+
if self.correction_result.metadata:
|
264
|
+
if "enabled_handlers" in self.correction_result.metadata:
|
265
|
+
enabled_handlers = self.correction_result.metadata["enabled_handlers"]
|
266
|
+
self.logger.info(f"Found existing enabled handlers in metadata: {enabled_handlers}")
|
267
|
+
elif "available_handlers" in self.correction_result.metadata:
|
268
|
+
# If no enabled_handlers but we have available_handlers, enable all default handlers
|
269
|
+
enabled_handlers = [
|
270
|
+
handler["id"] for handler in self.correction_result.metadata["available_handlers"] if handler.get("enabled", True)
|
271
|
+
]
|
272
|
+
self.logger.info(f"No enabled handlers found in metadata, using default enabled handlers: {enabled_handlers}")
|
273
|
+
else:
|
274
|
+
self.logger.warning("No handler configuration found in metadata")
|
275
|
+
|
276
|
+
# Log reference sources before correction
|
277
|
+
for source, lyrics in self.correction_result.reference_lyrics.items():
|
278
|
+
word_count = sum(len(s.words) for s in lyrics.segments)
|
279
|
+
self.logger.info(f"Reference source '{source}': {word_count} words in {len(lyrics.segments)} segments")
|
280
|
+
|
281
|
+
# Rerun correction with updated reference lyrics
|
282
|
+
self.logger.info("Initializing LyricsCorrector for re-correction")
|
283
|
+
self.logger.info(f"Passing enabled handlers to corrector: {enabled_handlers or '[]'}")
|
284
|
+
corrector = LyricsCorrector(
|
285
|
+
cache_dir=self.output_config.cache_dir,
|
286
|
+
enabled_handlers=enabled_handlers, # Pass the preserved handlers or None to use defaults
|
287
|
+
logger=self.logger,
|
288
|
+
)
|
289
|
+
|
290
|
+
self.logger.info(f"Active correction handlers: {[h.__class__.__name__ for h in corrector.handlers]}")
|
291
|
+
self.logger.info("Running correction with updated reference lyrics")
|
242
292
|
self.correction_result = corrector.run(
|
243
293
|
transcription_results=[TranscriptionResult(name="original", priority=1, result=transcription_data)],
|
244
294
|
lyrics_results=self.correction_result.reference_lyrics,
|
245
295
|
metadata=self.correction_result.metadata,
|
246
296
|
)
|
247
297
|
|
298
|
+
# Update metadata with the new handler state from corrector
|
299
|
+
if not self.correction_result.metadata:
|
300
|
+
self.correction_result.metadata = {}
|
301
|
+
self.correction_result.metadata.update(
|
302
|
+
{
|
303
|
+
"available_handlers": corrector.all_handlers,
|
304
|
+
"enabled_handlers": [getattr(handler, "name", handler.__class__.__name__) for handler in corrector.handlers],
|
305
|
+
}
|
306
|
+
)
|
307
|
+
|
308
|
+
self.logger.info("Correction process completed")
|
309
|
+
self.logger.info(
|
310
|
+
f"Updated metadata with {len(corrector.handlers)} enabled handlers: {self.correction_result.metadata['enabled_handlers']}"
|
311
|
+
)
|
312
|
+
|
248
313
|
# Restore audio hash
|
249
314
|
if audio_hash:
|
250
315
|
if not self.correction_result.metadata:
|
@@ -256,6 +321,171 @@ class ReviewServer:
|
|
256
321
|
self.logger.error(f"Failed to update handlers: {str(e)}")
|
257
322
|
raise HTTPException(status_code=500, detail=str(e))
|
258
323
|
|
324
|
+
def _create_lyrics_data_from_text(self, text: str, source: str) -> LyricsData:
|
325
|
+
"""Create LyricsData object from plain text lyrics."""
|
326
|
+
self.logger.info(f"Creating LyricsData for source '{source}'")
|
327
|
+
|
328
|
+
# Split text into lines and create segments
|
329
|
+
lines = [line.strip() for line in text.split("\n") if line.strip()]
|
330
|
+
self.logger.info(f"Found {len(lines)} non-empty lines in input text")
|
331
|
+
|
332
|
+
segments = []
|
333
|
+
for i, line in enumerate(lines):
|
334
|
+
# Split line into words
|
335
|
+
word_texts = line.strip().split()
|
336
|
+
words = []
|
337
|
+
|
338
|
+
for j, word_text in enumerate(word_texts):
|
339
|
+
word = Word(
|
340
|
+
id=f"manual_{source}_word_{i}_{j}", # Create unique ID for each word
|
341
|
+
text=word_text,
|
342
|
+
start_time=0.0, # Placeholder timing
|
343
|
+
end_time=0.0,
|
344
|
+
confidence=1.0, # Reference lyrics are considered ground truth
|
345
|
+
created_during_correction=False,
|
346
|
+
)
|
347
|
+
words.append(word)
|
348
|
+
|
349
|
+
segments.append(
|
350
|
+
LyricsSegment(
|
351
|
+
id=f"manual_{source}_{i}",
|
352
|
+
text=line,
|
353
|
+
words=words, # Now including the word objects
|
354
|
+
start_time=0.0, # Placeholder timing
|
355
|
+
end_time=0.0,
|
356
|
+
)
|
357
|
+
)
|
358
|
+
|
359
|
+
# Create metadata
|
360
|
+
self.logger.info("Creating metadata for LyricsData")
|
361
|
+
metadata = LyricsMetadata(
|
362
|
+
source=source,
|
363
|
+
track_name=self.correction_result.metadata.get("title", "") or "",
|
364
|
+
artist_names=self.correction_result.metadata.get("artist", "") or "",
|
365
|
+
is_synced=False,
|
366
|
+
lyrics_provider="manual",
|
367
|
+
lyrics_provider_id="",
|
368
|
+
album_name=None,
|
369
|
+
duration_ms=None,
|
370
|
+
explicit=None,
|
371
|
+
language=None,
|
372
|
+
provider_metadata={},
|
373
|
+
)
|
374
|
+
self.logger.info(f"Created metadata: {metadata}")
|
375
|
+
|
376
|
+
lyrics_data = LyricsData(segments=segments, metadata=metadata, source=source)
|
377
|
+
self.logger.info(f"Created LyricsData with {len(segments)} segments and {sum(len(s.words) for s in segments)} total words")
|
378
|
+
|
379
|
+
return lyrics_data
|
380
|
+
|
381
|
+
async def add_lyrics(self, data: Dict[str, str] = Body(...)):
|
382
|
+
"""Add new lyrics source and rerun correction."""
|
383
|
+
try:
|
384
|
+
# Store existing audio hash
|
385
|
+
audio_hash = self.correction_result.metadata.get("audio_hash") if self.correction_result.metadata else None
|
386
|
+
|
387
|
+
source = data.get("source", "").strip()
|
388
|
+
lyrics_text = data.get("lyrics", "").strip()
|
389
|
+
|
390
|
+
self.logger.info(f"Received request to add lyrics source '{source}' with {len(lyrics_text)} characters")
|
391
|
+
|
392
|
+
if not source or not lyrics_text:
|
393
|
+
self.logger.warning("Invalid request: missing source or lyrics text")
|
394
|
+
raise HTTPException(status_code=400, detail="Source name and lyrics text are required")
|
395
|
+
|
396
|
+
# Validate source name isn't already used
|
397
|
+
if source in self.correction_result.reference_lyrics:
|
398
|
+
self.logger.warning(f"Source name '{source}' is already in use")
|
399
|
+
raise HTTPException(status_code=400, detail=f"Source name '{source}' is already in use")
|
400
|
+
|
401
|
+
# Create lyrics data using the provider
|
402
|
+
self.logger.info("Creating LyricsData using UserInputProvider")
|
403
|
+
provider = UserInputProvider(
|
404
|
+
lyrics_text=lyrics_text, source_name=source, metadata=self.correction_result.metadata or {}, logger=self.logger
|
405
|
+
)
|
406
|
+
lyrics_data = provider._convert_result_format({"text": lyrics_text, "metadata": self.correction_result.metadata or {}})
|
407
|
+
self.logger.info(f"Created LyricsData with {len(lyrics_data.segments)} segments")
|
408
|
+
|
409
|
+
# Add to reference lyrics
|
410
|
+
self.logger.info(f"Adding new source '{source}' to reference_lyrics")
|
411
|
+
self.correction_result.reference_lyrics[source] = lyrics_data
|
412
|
+
self.logger.info(f"Now have {len(self.correction_result.reference_lyrics)} total reference sources")
|
413
|
+
|
414
|
+
# Create TranscriptionData from original segments
|
415
|
+
self.logger.info("Creating TranscriptionData from original segments")
|
416
|
+
transcription_data = TranscriptionData(
|
417
|
+
segments=self.correction_result.original_segments,
|
418
|
+
words=[word for segment in self.correction_result.original_segments for word in segment.words],
|
419
|
+
text="\n".join(segment.text for segment in self.correction_result.original_segments),
|
420
|
+
source="original",
|
421
|
+
)
|
422
|
+
|
423
|
+
# Get currently enabled handlers from metadata
|
424
|
+
enabled_handlers = None
|
425
|
+
if self.correction_result.metadata:
|
426
|
+
if "enabled_handlers" in self.correction_result.metadata:
|
427
|
+
enabled_handlers = self.correction_result.metadata["enabled_handlers"]
|
428
|
+
self.logger.info(f"Found existing enabled handlers in metadata: {enabled_handlers}")
|
429
|
+
elif "available_handlers" in self.correction_result.metadata:
|
430
|
+
# If no enabled_handlers but we have available_handlers, enable all default handlers
|
431
|
+
enabled_handlers = [
|
432
|
+
handler["id"] for handler in self.correction_result.metadata["available_handlers"] if handler.get("enabled", True)
|
433
|
+
]
|
434
|
+
self.logger.info(f"No enabled handlers found in metadata, using default enabled handlers: {enabled_handlers}")
|
435
|
+
else:
|
436
|
+
self.logger.warning("No handler configuration found in metadata")
|
437
|
+
|
438
|
+
# Log reference sources before correction
|
439
|
+
for source, lyrics in self.correction_result.reference_lyrics.items():
|
440
|
+
word_count = sum(len(s.words) for s in lyrics.segments)
|
441
|
+
self.logger.info(f"Reference source '{source}': {word_count} words in {len(lyrics.segments)} segments")
|
442
|
+
|
443
|
+
# Rerun correction with updated reference lyrics
|
444
|
+
self.logger.info("Initializing LyricsCorrector for re-correction")
|
445
|
+
self.logger.info(f"Passing enabled handlers to corrector: {enabled_handlers or '[]'}")
|
446
|
+
corrector = LyricsCorrector(
|
447
|
+
cache_dir=self.output_config.cache_dir,
|
448
|
+
enabled_handlers=enabled_handlers, # Pass the preserved handlers or None to use defaults
|
449
|
+
logger=self.logger,
|
450
|
+
)
|
451
|
+
|
452
|
+
self.logger.info(f"Active correction handlers: {[h.__class__.__name__ for h in corrector.handlers]}")
|
453
|
+
self.logger.info("Running correction with updated reference lyrics")
|
454
|
+
self.correction_result = corrector.run(
|
455
|
+
transcription_results=[TranscriptionResult(name="original", priority=1, result=transcription_data)],
|
456
|
+
lyrics_results=self.correction_result.reference_lyrics,
|
457
|
+
metadata=self.correction_result.metadata,
|
458
|
+
)
|
459
|
+
|
460
|
+
# Update metadata with the new handler state from corrector
|
461
|
+
if not self.correction_result.metadata:
|
462
|
+
self.correction_result.metadata = {}
|
463
|
+
self.correction_result.metadata.update(
|
464
|
+
{
|
465
|
+
"available_handlers": corrector.all_handlers,
|
466
|
+
"enabled_handlers": [getattr(handler, "name", handler.__class__.__name__) for handler in corrector.handlers],
|
467
|
+
}
|
468
|
+
)
|
469
|
+
|
470
|
+
# Restore audio hash
|
471
|
+
if audio_hash:
|
472
|
+
if not self.correction_result.metadata:
|
473
|
+
self.correction_result.metadata = {}
|
474
|
+
self.correction_result.metadata["audio_hash"] = audio_hash
|
475
|
+
|
476
|
+
self.logger.info("Correction process completed")
|
477
|
+
self.logger.info(
|
478
|
+
f"Updated metadata with {len(corrector.handlers)} enabled handlers: {self.correction_result.metadata['enabled_handlers']}"
|
479
|
+
)
|
480
|
+
|
481
|
+
return {"status": "success", "data": self.correction_result.to_dict()}
|
482
|
+
|
483
|
+
except HTTPException:
|
484
|
+
raise
|
485
|
+
except Exception as e:
|
486
|
+
self.logger.error(f"Failed to add lyrics: {str(e)}", exc_info=True)
|
487
|
+
raise HTTPException(status_code=500, detail=str(e))
|
488
|
+
|
259
489
|
def start(self) -> CorrectionResult:
|
260
490
|
"""Start the review server and wait for completion."""
|
261
491
|
# Generate audio hash if audio file exists
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: lyrics-transcriber
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.44.0
|
4
4
|
Summary: Automatically create synchronised lyrics files in ASS and MidiCo LRC formats with word-level timestamps, using Whisper and lyrics from Genius and Spotify
|
5
5
|
License: MIT
|
6
6
|
Author: Andrew Beveridge
|
@@ -16,10 +16,11 @@ Requires-Dist: dropbox (>=12)
|
|
16
16
|
Requires-Dist: fastapi (>=0.115)
|
17
17
|
Requires-Dist: fonttools (>=4.55)
|
18
18
|
Requires-Dist: karaoke-lyrics-processor (>=0.4)
|
19
|
-
Requires-Dist: lyricsgenius (>=
|
19
|
+
Requires-Dist: lyricsgenius (>=0.1.0)
|
20
20
|
Requires-Dist: metaphone (>=0.6)
|
21
21
|
Requires-Dist: nltk (>=3.9)
|
22
22
|
Requires-Dist: ollama (>=0.4.7,<0.5.0)
|
23
|
+
Requires-Dist: openai (>=1.63.2,<2.0.0)
|
23
24
|
Requires-Dist: pydub (>=0.25)
|
24
25
|
Requires-Dist: python-dotenv (>=1)
|
25
26
|
Requires-Dist: python-levenshtein (>=0.26)
|
@@ -3,14 +3,15 @@ lyrics_transcriber/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
|
|
3
3
|
lyrics_transcriber/cli/cli_main.py,sha256=MDgjIlgmKDfv3z6nK_j7TJKtcijfuLrB06hDMXXaZQY,10211
|
4
4
|
lyrics_transcriber/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
5
5
|
lyrics_transcriber/core/config.py,sha256=euwOOtuNbXy4-a1xs8QKdjcf5jXZQle0zf6X1Wthurw,1229
|
6
|
-
lyrics_transcriber/core/controller.py,sha256=
|
7
|
-
lyrics_transcriber/correction/anchor_sequence.py,sha256=
|
8
|
-
lyrics_transcriber/correction/corrector.py,sha256=
|
6
|
+
lyrics_transcriber/core/controller.py,sha256=66qwIv-2jEW94wU5RVFRIcfrTyszC-aC_Fcx5dCjG7k,20255
|
7
|
+
lyrics_transcriber/correction/anchor_sequence.py,sha256=QB9_74YsMTMRyEqNNqaSx-6MEO7mmkKstywfvkujT7g,30089
|
8
|
+
lyrics_transcriber/correction/corrector.py,sha256=cMraMRE27RtWN7BocM77NDNCLY1FV4ocKM8dP7bVcuQ,20848
|
9
9
|
lyrics_transcriber/correction/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
10
|
lyrics_transcriber/correction/handlers/base.py,sha256=ZXYMFgbCmlD62dpqdFwFPlcePdHKEFrABffnG_Mu5mI,1687
|
11
11
|
lyrics_transcriber/correction/handlers/extend_anchor.py,sha256=wGGEtVmcEdYOTNuQQFz7Afhpfnn4Su0soiPmnY0dIRo,5944
|
12
12
|
lyrics_transcriber/correction/handlers/levenshtein.py,sha256=hMERQHVgiUDSHtamYrAjqZ3qMMok4VmQ_MYM2-nrX6w,7864
|
13
|
-
lyrics_transcriber/correction/handlers/llm.py,sha256=
|
13
|
+
lyrics_transcriber/correction/handlers/llm.py,sha256=ufqHtohdU5dUXE3DikzbloAWGVgMu1wnw6P4WHRmpdk,14580
|
14
|
+
lyrics_transcriber/correction/handlers/llm_providers.py,sha256=MV-KCRseccg-DEimMS0D2bXJ2xhy59r2n8UZjICUoEY,2067
|
14
15
|
lyrics_transcriber/correction/handlers/no_space_punct_match.py,sha256=jY2fa547Qc8B63xIhF9VyWMaq5jds6E6wBqyVq6KANw,7057
|
15
16
|
lyrics_transcriber/correction/handlers/relaxed_word_count_match.py,sha256=x4k__6gav4-STk_TycLcg5Sw4x2vUFAj5fWmOv7Yd_w,3911
|
16
17
|
lyrics_transcriber/correction/handlers/repeat.py,sha256=1PJADW44egYh7N9D2fN-gDIusWVglFjGHrCZuTQYNpA,4313
|
@@ -21,66 +22,71 @@ lyrics_transcriber/correction/handlers/word_operations.py,sha256=410xhyO9tiqezV5
|
|
21
22
|
lyrics_transcriber/correction/phrase_analyzer.py,sha256=dtO_2LjxnPdHJM7De40mYIdHCkozwhizVVQp5XGO7x0,16962
|
22
23
|
lyrics_transcriber/correction/text_utils.py,sha256=z4eiTBCmkNeTUvxG_RpR1Zwg0cbMPKFyxVaKAvLAk88,761
|
23
24
|
lyrics_transcriber/frontend/.gitignore,sha256=lgGIPiVpFVUNSZl9oNQLelLOWUzpF7sikLW8xmsrrqI,248
|
24
|
-
lyrics_transcriber/frontend/.yarn/install-state.gz,sha256=
|
25
|
+
lyrics_transcriber/frontend/.yarn/install-state.gz,sha256=kcgQ-S9HvdNHexkXQVt18LWUpqtP2mdyRfjJV1htFAc,345895
|
25
26
|
lyrics_transcriber/frontend/.yarn/releases/yarn-4.6.0.cjs,sha256=6vHuq8FkpEygtl29zNVK9-VfP_kpSz_zGNWq7JLysgs,2764946
|
26
27
|
lyrics_transcriber/frontend/.yarnrc.yml,sha256=RIUAbDBlfdQoS1V4MjkeMHzQqi4cvIWSzY5T3gEB_1I,66
|
27
28
|
lyrics_transcriber/frontend/README.md,sha256=-D6CAfKTT7Y0V3EjlZ2fMy7fyctFQ4x2TJ9vx6xtccM,1607
|
28
|
-
lyrics_transcriber/frontend/dist/assets/index-
|
29
|
-
lyrics_transcriber/frontend/dist/assets/index-
|
30
|
-
lyrics_transcriber/frontend/dist/index.html,sha256=
|
29
|
+
lyrics_transcriber/frontend/dist/assets/index-DVoI6Z16.js,sha256=2xxswQwdYHoQRNsV7gz9OHtwDH4yTOFTpT3mU3Eej2Q,1211733
|
30
|
+
lyrics_transcriber/frontend/dist/assets/index-DVoI6Z16.js.map,sha256=AMz62uaShqqb0KqsQpCXOf6piu57QfAvzoIKzkYki7s,2550722
|
31
|
+
lyrics_transcriber/frontend/dist/index.html,sha256=T5hrDDR_1fDv6yEAqbpqhIaDN8PH3eKuB1J7bLf1xGA,400
|
31
32
|
lyrics_transcriber/frontend/dist/vite.svg,sha256=SnSK_UQ5GLsWWRyDTEAdrjPoeGGrXbrQgRw6O0qSFPs,1497
|
32
33
|
lyrics_transcriber/frontend/eslint.config.js,sha256=3ADH23ANA4NNBKFy6nCVk65e8bx1DrVd_FIaYNnhuqA,734
|
33
34
|
lyrics_transcriber/frontend/index.html,sha256=KfqJVONzpUyPIwV73nZRiCWlwLnFWeB3z0vzxDPNudU,376
|
34
35
|
lyrics_transcriber/frontend/package.json,sha256=kQ0_UiU4xp8wnu-hbTBTAxUB6S_cQMzHM83Dmm5x70s,1181
|
35
36
|
lyrics_transcriber/frontend/public/vite.svg,sha256=SnSK_UQ5GLsWWRyDTEAdrjPoeGGrXbrQgRw6O0qSFPs,1497
|
36
|
-
lyrics_transcriber/frontend/src/App.tsx,sha256=
|
37
|
-
lyrics_transcriber/frontend/src/api.ts,sha256=
|
38
|
-
lyrics_transcriber/frontend/src/components/
|
39
|
-
lyrics_transcriber/frontend/src/components/
|
40
|
-
lyrics_transcriber/frontend/src/components/
|
41
|
-
lyrics_transcriber/frontend/src/components/EditModal.tsx,sha256=
|
37
|
+
lyrics_transcriber/frontend/src/App.tsx,sha256=oS1p02iwKv76-psVVFYW8fIWVN3CSG4DjfTrPvJP9m4,6530
|
38
|
+
lyrics_transcriber/frontend/src/api.ts,sha256=UgqPc1jo8DEVgxh3_9Lyf9GBsHYpqMAqsPEE5BzTV4w,6640
|
39
|
+
lyrics_transcriber/frontend/src/components/AddLyricsModal.tsx,sha256=ubJwQewryjUrXwpBkITQNu4POhoUtDbNA93cqa-yJKY,3416
|
40
|
+
lyrics_transcriber/frontend/src/components/AudioPlayer.tsx,sha256=amjYyYW6HZ9TD5RwqQLSmGbwk-5Ec9mtXza3F3045n4,5337
|
41
|
+
lyrics_transcriber/frontend/src/components/CorrectionMetrics.tsx,sha256=CoTZS9Z3pf4lfPrzpQ2hZvLqFvt-IarSGBSCxFxD-y4,6274
|
42
|
+
lyrics_transcriber/frontend/src/components/EditModal.tsx,sha256=f1AoMcutIXnOhH5dU67BUpIp6upucGUi8FK6oBekB5A,24490
|
42
43
|
lyrics_transcriber/frontend/src/components/FileUpload.tsx,sha256=fwn2rMWtMLPTZLREMb3ps4prSf9nzxGwnjmeC6KYsJA,2383
|
43
|
-
lyrics_transcriber/frontend/src/components/
|
44
|
-
lyrics_transcriber/frontend/src/components/
|
45
|
-
lyrics_transcriber/frontend/src/components/
|
46
|
-
lyrics_transcriber/frontend/src/components/
|
47
|
-
lyrics_transcriber/frontend/src/components/
|
48
|
-
lyrics_transcriber/frontend/src/components/
|
44
|
+
lyrics_transcriber/frontend/src/components/FindReplaceModal.tsx,sha256=U7duKns4IqNXwbWFbQfdyaswnvkSRpfsU0UG__-Serc,20192
|
45
|
+
lyrics_transcriber/frontend/src/components/GlobalSyncEditor.tsx,sha256=KuEPB4WvCjVQDGK5rowZMTeID95VWl1Gaoha_6PLNJM,28080
|
46
|
+
lyrics_transcriber/frontend/src/components/Header.tsx,sha256=3bgJ29W6WKO7FYRuBXQlqlo7-AYLHfxsG_Mr38y8W_Y,12303
|
47
|
+
lyrics_transcriber/frontend/src/components/LyricsAnalyzer.tsx,sha256=piimIBZpgA25hMxlVQcvCEURZj_I6IfDY2GvZyQ-tkg,24844
|
48
|
+
lyrics_transcriber/frontend/src/components/ModeSelector.tsx,sha256=OuCOqePGs5JC3NxZxrR-rDu5W5WSObuxrLVOIaqHDOs,1941
|
49
|
+
lyrics_transcriber/frontend/src/components/PreviewVideoSection.tsx,sha256=-9_ljoaadHjAAvia_vhEUgCajPv2jFnRDVR6VWN_a0w,4166
|
50
|
+
lyrics_transcriber/frontend/src/components/ReferenceView.tsx,sha256=QfK-VzpPcS4iUcYN6iAWE3yQK4rWQJJ-D80DzgixI3I,9436
|
51
|
+
lyrics_transcriber/frontend/src/components/ReviewChangesModal.tsx,sha256=zcGoIu5Iqs4ZXpGr3yeMIEKPf8FRLCP2i1TzNOmKzg0,13048
|
49
52
|
lyrics_transcriber/frontend/src/components/SegmentDetailsModal.tsx,sha256=6ME02FkFwCgDAxW49yW260N4vbr80eAJ332Ex811GOo,1643
|
50
|
-
lyrics_transcriber/frontend/src/components/TimelineEditor.tsx,sha256=
|
51
|
-
lyrics_transcriber/frontend/src/components/TranscriptionView.tsx,sha256=
|
52
|
-
lyrics_transcriber/frontend/src/components/
|
53
|
-
lyrics_transcriber/frontend/src/components/shared/components/HighlightedText.tsx,sha256=
|
54
|
-
lyrics_transcriber/frontend/src/components/shared/components/SourceSelector.tsx,sha256=
|
55
|
-
lyrics_transcriber/frontend/src/components/shared/components/Word.tsx,sha256=
|
53
|
+
lyrics_transcriber/frontend/src/components/TimelineEditor.tsx,sha256=Aa6ykDRVhWUNHcJ14KGzmUCPDCAltw9gXpdR5ogVQpc,12842
|
54
|
+
lyrics_transcriber/frontend/src/components/TranscriptionView.tsx,sha256=gSs7ywxP1cPlUVlLQpXEgXuhyaqn2rZU887Kgog45Y4,7406
|
55
|
+
lyrics_transcriber/frontend/src/components/WordDivider.tsx,sha256=DKA8jwD31YI6sRUvfH3NasrXAUOf-z3Iv_NBFtZiIE0,6446
|
56
|
+
lyrics_transcriber/frontend/src/components/shared/components/HighlightedText.tsx,sha256=GHEpj6Hw_cUP4xKmg7sEfV4qiS0dVAVU28u2sCm8nTc,16085
|
57
|
+
lyrics_transcriber/frontend/src/components/shared/components/SourceSelector.tsx,sha256=zZpnQd6RlcGlr2v6T90Eva1cdEkiWzIVE78xAaQPObA,1144
|
58
|
+
lyrics_transcriber/frontend/src/components/shared/components/Word.tsx,sha256=zFblGPuy560gB0nGq6hYrZ09ygn_YRI69IiQibowQ5I,2181
|
56
59
|
lyrics_transcriber/frontend/src/components/shared/constants.ts,sha256=25q1qjCwzV-hR72wSb_rJSe4dVuQ0l-piLMoZSpynGQ,488
|
57
60
|
lyrics_transcriber/frontend/src/components/shared/hooks/useWordClick.ts,sha256=aRDzH144FYuK9N3Y0wyTp2c1-DJOT_Y3HWQHHGqiUsY,6196
|
58
61
|
lyrics_transcriber/frontend/src/components/shared/styles.ts,sha256=J1jCSuRqpk1mOFYAqJudhxeozH-q1bi-dsOibLukBJU,411
|
59
62
|
lyrics_transcriber/frontend/src/components/shared/types.js,sha256=1DqoH1vIn6o1ng-XyBS6JRVVkf8Hj7ub_UD4x8loMjA,77
|
60
|
-
lyrics_transcriber/frontend/src/components/shared/types.ts,sha256
|
61
|
-
lyrics_transcriber/frontend/src/components/shared/utils/keyboardHandlers.ts,sha256=
|
63
|
+
lyrics_transcriber/frontend/src/components/shared/types.ts,sha256=-HniySfrxsjmciMvtXu_bSNAyVHbVAZynRDTC90S5L4,3840
|
64
|
+
lyrics_transcriber/frontend/src/components/shared/utils/keyboardHandlers.ts,sha256=PyzkwJMnm3FaRoX-scBUCSZHiMqhdhy6gDoEpULUVCQ,3918
|
62
65
|
lyrics_transcriber/frontend/src/components/shared/utils/localStorage.ts,sha256=jpLT65Rk_toaB-8X2lRGyYZ9EoMQDI45GviUT7N9Bp0,3240
|
63
66
|
lyrics_transcriber/frontend/src/components/shared/utils/referenceLineCalculator.ts,sha256=TJ2oHDitFFVxm83eFEhdlwvhx--mIt3054YbET2RiXs,2575
|
64
|
-
lyrics_transcriber/frontend/src/components/shared/utils/segmentOperations.ts,sha256=
|
67
|
+
lyrics_transcriber/frontend/src/components/shared/utils/segmentOperations.ts,sha256=m1pUrjZcAch85Xqm9EX43BuoHQjdvBjY5BZ70LWa1hk,11074
|
65
68
|
lyrics_transcriber/frontend/src/components/shared/utils/wordUtils.ts,sha256=bZbsvEgY3JoI15l4SdB51tHE33OkUxDH-WSG8doLcCQ,721
|
66
|
-
lyrics_transcriber/frontend/src/
|
69
|
+
lyrics_transcriber/frontend/src/hooks/useManualSync.ts,sha256=fTAtHeO1Ca6o0n01DtietCHNgBFfvFEsXtQQO2orRWI,10775
|
70
|
+
lyrics_transcriber/frontend/src/main.tsx,sha256=UXPXUc2HeDuGtW5GVzP312RjCo3TdnpBal7SWild-k4,345
|
71
|
+
lyrics_transcriber/frontend/src/theme.ts,sha256=9F2xyLct_gJmvLEZEhrYdKIahUsBzi5kgnydSWJHphE,3864
|
67
72
|
lyrics_transcriber/frontend/src/types/global.d.ts,sha256=NvltPF-n4_1oRLfihD3oHXbdT7txMC8B6fhCgvNY-jk,191
|
68
73
|
lyrics_transcriber/frontend/src/types.js,sha256=1DqoH1vIn6o1ng-XyBS6JRVVkf8Hj7ub_UD4x8loMjA,77
|
69
|
-
lyrics_transcriber/frontend/src/types.ts,sha256=
|
74
|
+
lyrics_transcriber/frontend/src/types.ts,sha256=FdPWw0QEm43MigcAIhRtyHUNqk6-mOUzM8bIV7hCzSU,3504
|
70
75
|
lyrics_transcriber/frontend/src/validation.ts,sha256=Pv_FtySk6q3a1z_W0-ItxiEX8OIYkgCDwXKGUds4Lx4,4275
|
71
76
|
lyrics_transcriber/frontend/src/vite-env.d.ts,sha256=ZZlpNvuwQpFfe3SiAPzd5-QQ8ypmmxq5WXz6pLD63bU,38
|
72
77
|
lyrics_transcriber/frontend/tsconfig.app.json,sha256=7aUBVcaBqEtmtfQXsbwsgBxSUng06xzQi5t4QCgWQ3E,665
|
73
78
|
lyrics_transcriber/frontend/tsconfig.json,sha256=AOS5v1AsNPL3wGc8bt58Ybh8HHpbYrlK91q0KIzaSgs,627
|
74
79
|
lyrics_transcriber/frontend/tsconfig.node.json,sha256=oMBhK5xufBrVE7SkbADRxA3pxm8_L9m5YwtCOZSafsc,536
|
75
|
-
lyrics_transcriber/frontend/tsconfig.tsbuildinfo,sha256=
|
80
|
+
lyrics_transcriber/frontend/tsconfig.tsbuildinfo,sha256=fJpJ17UBUxK7eUnWy-ZWbp2QftNCAqUyzJnDe_jo_Fc,1429
|
76
81
|
lyrics_transcriber/frontend/vite.config.d.ts,sha256=S5bdGf0pSdKM6A6RNBKwAm3EIeW_bDHYfHtesRtXU7Q,76
|
77
82
|
lyrics_transcriber/frontend/vite.config.js,sha256=P4GuPgRZzwEWPQZpyujUe7eA3mjPoFAe2CgE5sQAXg8,232
|
78
83
|
lyrics_transcriber/frontend/vite.config.ts,sha256=8FdW0dN8zDFqfhQSxX5h7sIu72X2piLYlp_TZYRQvBQ,216
|
79
84
|
lyrics_transcriber/frontend/yarn.lock,sha256=wtImLsCO1P1Lpkhc1jAN6IiHQ0As4xn39n0cwKoh4LM,131996
|
80
|
-
lyrics_transcriber/lyrics/base_lyrics_provider.py,sha256=
|
85
|
+
lyrics_transcriber/lyrics/base_lyrics_provider.py,sha256=mqlqssKG2AofvqEU48nCwLnz0FhO9Ee6MNixF6GBnYY,9133
|
81
86
|
lyrics_transcriber/lyrics/file_provider.py,sha256=ksjVCtzzyK1lhKrYBed0P61wR3TV998Em2Dr7raqWwk,4086
|
82
87
|
lyrics_transcriber/lyrics/genius.py,sha256=SIMFEmD_QbXUB8hpDhRU7AAyVrJbRvKyTWsShA9jecE,5693
|
83
88
|
lyrics_transcriber/lyrics/spotify.py,sha256=K7aL_OHdQjhI8ydnHUq8-PUvkyDu2s-et7njiLIBVgY,5457
|
89
|
+
lyrics_transcriber/lyrics/user_input_provider.py,sha256=oNzwjk2bOQYyUXvVqPcbrF8vJU7LLtwTvJTXxtPaQto,1798
|
84
90
|
lyrics_transcriber/output/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
85
91
|
lyrics_transcriber/output/ass/__init__.py,sha256=EYQ45gI7_-vclVgzISL0ML8VgxCdB0odqEyPyiPCIw0,578
|
86
92
|
lyrics_transcriber/output/ass/ass.py,sha256=xHId7Rv5gqmdQ7ZrWQSy46JX7vZcB_BzpZC800DwQk8,74315
|
@@ -124,15 +130,15 @@ lyrics_transcriber/output/fonts/Zurich_Cn_BT_Bold.ttf,sha256=WNG5LOQ-uGUF_WWT5aQ
|
|
124
130
|
lyrics_transcriber/output/fonts/arial.ttf,sha256=NcDzVZ2NtWnjbDEJW4pg1EFkPZX1kTneQOI_ragZuDM,275572
|
125
131
|
lyrics_transcriber/output/fonts/georgia.ttf,sha256=fQuyDGMrtZ6BoIhfVzvSFz9x9zIE3pBY_raM4DIicHI,142964
|
126
132
|
lyrics_transcriber/output/fonts/verdana.ttf,sha256=lu0UlJyktzks_yNbnEHVXBJTgqu-DA08K53WaJfK4Ms,139640
|
127
|
-
lyrics_transcriber/output/generator.py,sha256=
|
133
|
+
lyrics_transcriber/output/generator.py,sha256=dpEIqdX0Dc0_kpfOoZMxGryVIopSRSgnV7EjVEB7YZw,10916
|
128
134
|
lyrics_transcriber/output/lrc_to_cdg.py,sha256=2pi5tvreD_ADAR4RF5yVwj7OJ4Pf5Zo_EJ7rt4iH3k0,2063
|
129
135
|
lyrics_transcriber/output/lyrics_file.py,sha256=_KQyQjCOMIwQdQ0115uEAUIjQWTRmShkSfQuINPKxaw,3741
|
130
136
|
lyrics_transcriber/output/plain_text.py,sha256=XARaWcy6MeQeQCUoz0PV_bHoBw5dba-u79bjS7XucnE,3867
|
131
137
|
lyrics_transcriber/output/segment_resizer.py,sha256=R2Z15F7aa7DQwgAf0EMNIQ-aYQhjs0JbhqoK_bW5hCA,17453
|
132
138
|
lyrics_transcriber/output/subtitles.py,sha256=yQCR7YO3aitKnGRjfAtSwsdi6byfpEZgnCumJO16M2E,19085
|
133
|
-
lyrics_transcriber/output/video.py,sha256=
|
139
|
+
lyrics_transcriber/output/video.py,sha256=L_KB33YM4X-EQBRcLIPO4ZqlNEcVwqTWKjaJZVtkN-4,13751
|
134
140
|
lyrics_transcriber/review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
135
|
-
lyrics_transcriber/review/server.py,sha256=
|
141
|
+
lyrics_transcriber/review/server.py,sha256=D5wMRdwdjW7Y1KnL4dON1rIrZpJg7jhqU_lK1q4ssqg,27445
|
136
142
|
lyrics_transcriber/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
137
143
|
lyrics_transcriber/storage/dropbox.py,sha256=Dyam1ULTkoxD1X5trkZ5dGp5XhBGCn998moC8IS9-68,9804
|
138
144
|
lyrics_transcriber/transcribers/audioshake.py,sha256=pUR--5DgpYyJ-RFqdoLDf_2cHXI5CO239r5deDZRXVc,8938
|
@@ -140,8 +146,8 @@ lyrics_transcriber/transcribers/base_transcriber.py,sha256=T3m4ZCwZ9Bpv6Jvb2hNcn
|
|
140
146
|
lyrics_transcriber/transcribers/whisper.py,sha256=YcCB1ic9H6zL1GS0jD0emu8-qlcH0QVEjjjYB4aLlIQ,13260
|
141
147
|
lyrics_transcriber/types.py,sha256=d73cDstrEI_tVgngDYYYFwjZNs6OVBuAB_QDkga7dWA,19841
|
142
148
|
lyrics_transcriber/utils/word_utils.py,sha256=-cMGpj9UV4F6IsoDKAV2i1aiqSO8eI91HMAm_igtVMk,958
|
143
|
-
lyrics_transcriber-0.
|
144
|
-
lyrics_transcriber-0.
|
145
|
-
lyrics_transcriber-0.
|
146
|
-
lyrics_transcriber-0.
|
147
|
-
lyrics_transcriber-0.
|
149
|
+
lyrics_transcriber-0.44.0.dist-info/LICENSE,sha256=BiPihPDxhxIPEx6yAxVfAljD5Bhm_XG2teCbPEj_m0Y,1069
|
150
|
+
lyrics_transcriber-0.44.0.dist-info/METADATA,sha256=l736Hpfv8P3G8SKqfZ5GUJZRLt9WsMt1SQerfbc8p7I,6017
|
151
|
+
lyrics_transcriber-0.44.0.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
|
152
|
+
lyrics_transcriber-0.44.0.dist-info/entry_points.txt,sha256=kcp-bSFkCACAEA0t166Kek0HpaJUXRo5SlF5tVrqNBU,216
|
153
|
+
lyrics_transcriber-0.44.0.dist-info/RECORD,,
|