lyrics-transcriber 0.56.1__py3-none-any.whl → 0.57.1__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.
@@ -5,7 +5,7 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>Lyrics Transcriber Analyzer</title>
8
- <script type="module" crossorigin src="/assets/index-C6nHrD6T.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-BEnewYea.js"></script>
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
@@ -19,6 +19,7 @@ import json
19
19
  from lyrics_transcriber.correction.corrector import LyricsCorrector
20
20
  from lyrics_transcriber.types import TranscriptionResult, TranscriptionData
21
21
  from lyrics_transcriber.lyrics.user_input_provider import UserInputProvider
22
+ from lyrics_transcriber.correction.operations import CorrectionOperations
22
23
 
23
24
 
24
25
  class ReviewServer:
@@ -83,62 +84,7 @@ class ReviewServer:
83
84
 
84
85
  def _update_correction_result(self, base_result: CorrectionResult, updated_data: Dict[str, Any]) -> CorrectionResult:
85
86
  """Update a CorrectionResult with new correction data."""
86
- return CorrectionResult(
87
- corrections=[
88
- WordCorrection(
89
- original_word=c.get("original_word", "").strip(),
90
- corrected_word=c.get("corrected_word", "").strip(),
91
- original_position=c.get("original_position", 0),
92
- source=c.get("source", "review"),
93
- reason=c.get("reason", "manual_review"),
94
- segment_index=c.get("segment_index", 0),
95
- confidence=c.get("confidence"),
96
- alternatives=c.get("alternatives", {}),
97
- is_deletion=c.get("is_deletion", False),
98
- split_index=c.get("split_index"),
99
- split_total=c.get("split_total"),
100
- corrected_position=c.get("corrected_position"),
101
- reference_positions=c.get("reference_positions"),
102
- length=c.get("length", 1),
103
- handler=c.get("handler"),
104
- word_id=c.get("word_id"),
105
- corrected_word_id=c.get("corrected_word_id"),
106
- )
107
- for c in updated_data["corrections"]
108
- ],
109
- corrected_segments=[
110
- LyricsSegment(
111
- id=s["id"],
112
- text=s["text"].strip(),
113
- words=[
114
- Word(
115
- id=w["id"],
116
- text=w["text"].strip(),
117
- start_time=w["start_time"],
118
- end_time=w["end_time"],
119
- confidence=w.get("confidence"),
120
- created_during_correction=w.get("created_during_correction", False),
121
- )
122
- for w in s["words"]
123
- ],
124
- start_time=s["start_time"],
125
- end_time=s["end_time"],
126
- )
127
- for s in updated_data["corrected_segments"]
128
- ],
129
- # Copy existing fields from the base result
130
- original_segments=base_result.original_segments,
131
- corrections_made=len(updated_data["corrections"]),
132
- confidence=base_result.confidence,
133
- reference_lyrics=base_result.reference_lyrics,
134
- anchor_sequences=base_result.anchor_sequences,
135
- gap_sequences=base_result.gap_sequences,
136
- resized_segments=None, # Will be generated if needed
137
- metadata=base_result.metadata,
138
- correction_steps=base_result.correction_steps,
139
- word_id_map=base_result.word_id_map,
140
- segment_id_map=base_result.segment_id_map,
141
- )
87
+ return CorrectionOperations.update_correction_result_with_data(base_result, updated_data)
142
88
 
143
89
  async def complete_review(self, updated_data: Dict[str, Any] = Body(...)):
144
90
  """Complete the review process."""
@@ -172,41 +118,21 @@ class ReviewServer:
172
118
  async def generate_preview_video(self, updated_data: Dict[str, Any] = Body(...)):
173
119
  """Generate a preview video with the current corrections."""
174
120
  try:
175
- # Create temporary correction result with updated data
176
- temp_correction = self._update_correction_result(self.correction_result, updated_data)
177
-
178
- # Generate a unique hash for this preview
179
- preview_data = json.dumps(updated_data, sort_keys=True).encode("utf-8")
180
- preview_hash = hashlib.md5(preview_data).hexdigest()[:12] # Use first 12 chars for shorter filename
181
-
182
- # Initialize output generator with preview settings
183
- preview_config = OutputConfig(
184
- output_dir=self.output_config.output_dir,
185
- cache_dir=self.output_config.cache_dir,
186
- output_styles_json=self.output_config.output_styles_json,
187
- video_resolution="360p", # Force 360p for preview
188
- styles=self.output_config.styles,
189
- max_line_length=self.output_config.max_line_length,
190
- )
191
- output_generator = OutputGenerator(config=preview_config, logger=self.logger, preview_mode=True)
192
-
193
- # Generate preview outputs with unique prefix
194
- preview_outputs = output_generator.generate_outputs(
195
- transcription_corrected=temp_correction,
196
- lyrics_results={}, # Empty dict since we don't need lyrics results for preview
197
- output_prefix=f"preview_{preview_hash}", # Include hash in filename
121
+ # Use shared operation for preview generation
122
+ result = CorrectionOperations.generate_preview_video(
123
+ correction_result=self.correction_result,
124
+ updated_data=updated_data,
125
+ output_config=self.output_config,
198
126
  audio_filepath=self.audio_filepath,
127
+ logger=self.logger
199
128
  )
200
-
201
- if not preview_outputs.video:
202
- raise ValueError("Preview video generation failed")
203
-
129
+
204
130
  # Store the path for later retrieval
205
131
  if not hasattr(self, "preview_videos"):
206
132
  self.preview_videos = {}
207
- self.preview_videos[preview_hash] = preview_outputs.video
133
+ self.preview_videos[result["preview_hash"]] = result["video_path"]
208
134
 
209
- return {"status": "success", "preview_hash": preview_hash}
135
+ return {"status": "success", "preview_hash": result["preview_hash"]}
210
136
 
211
137
  except Exception as e:
212
138
  self.logger.error(f"Failed to generate preview video: {str(e)}")
@@ -240,83 +166,14 @@ class ReviewServer:
240
166
  async def update_handlers(self, enabled_handlers: List[str] = Body(...)):
241
167
  """Update enabled correction handlers and rerun correction."""
242
168
  try:
243
- # Store existing audio hash
244
- audio_hash = self.correction_result.metadata.get("audio_hash") if self.correction_result.metadata else None
245
-
246
- # Update metadata with new handler configuration
247
- if not self.correction_result.metadata:
248
- self.correction_result.metadata = {}
249
- self.correction_result.metadata["enabled_handlers"] = enabled_handlers
250
-
251
- # Rerun correction with updated handlers
252
- corrector = LyricsCorrector(cache_dir=self.output_config.cache_dir, enabled_handlers=enabled_handlers, logger=self.logger)
253
-
254
- # Create proper TranscriptionData from original segments
255
- transcription_data = TranscriptionData(
256
- segments=self.correction_result.original_segments,
257
- words=[word for segment in self.correction_result.original_segments for word in segment.words],
258
- text="\n".join(segment.text for segment in self.correction_result.original_segments),
259
- source="original",
260
- )
261
-
262
- # Get currently enabled handlers from metadata
263
- enabled_handlers = None
264
- if self.correction_result.metadata:
265
- if "enabled_handlers" in self.correction_result.metadata:
266
- enabled_handlers = self.correction_result.metadata["enabled_handlers"]
267
- self.logger.info(f"Found existing enabled handlers in metadata: {enabled_handlers}")
268
- elif "available_handlers" in self.correction_result.metadata:
269
- # If no enabled_handlers but we have available_handlers, enable all default handlers
270
- enabled_handlers = [
271
- handler["id"] for handler in self.correction_result.metadata["available_handlers"] if handler.get("enabled", True)
272
- ]
273
- self.logger.info(f"No enabled handlers found in metadata, using default enabled handlers: {enabled_handlers}")
274
- else:
275
- self.logger.warning("No handler configuration found in metadata")
276
-
277
- # Log reference sources before correction
278
- for source, lyrics in self.correction_result.reference_lyrics.items():
279
- word_count = sum(len(s.words) for s in lyrics.segments)
280
- self.logger.info(f"Reference source '{source}': {word_count} words in {len(lyrics.segments)} segments")
281
-
282
- # Rerun correction with updated reference lyrics
283
- self.logger.info("Initializing LyricsCorrector for re-correction")
284
- self.logger.info(f"Passing enabled handlers to corrector: {enabled_handlers or '[]'}")
285
- corrector = LyricsCorrector(
169
+ # Use shared operation for handler updates
170
+ self.correction_result = CorrectionOperations.update_correction_handlers(
171
+ correction_result=self.correction_result,
172
+ enabled_handlers=enabled_handlers,
286
173
  cache_dir=self.output_config.cache_dir,
287
- enabled_handlers=enabled_handlers, # Pass the preserved handlers or None to use defaults
288
- logger=self.logger,
289
- )
290
-
291
- self.logger.info(f"Active correction handlers: {[h.__class__.__name__ for h in corrector.handlers]}")
292
- self.logger.info("Running correction with updated reference lyrics")
293
- self.correction_result = corrector.run(
294
- transcription_results=[TranscriptionResult(name="original", priority=1, result=transcription_data)],
295
- lyrics_results=self.correction_result.reference_lyrics,
296
- metadata=self.correction_result.metadata,
174
+ logger=self.logger
297
175
  )
298
176
 
299
- # Update metadata with the new handler state from corrector
300
- if not self.correction_result.metadata:
301
- self.correction_result.metadata = {}
302
- self.correction_result.metadata.update(
303
- {
304
- "available_handlers": corrector.all_handlers,
305
- "enabled_handlers": [getattr(handler, "name", handler.__class__.__name__) for handler in corrector.handlers],
306
- }
307
- )
308
-
309
- self.logger.info("Correction process completed")
310
- self.logger.info(
311
- f"Updated metadata with {len(corrector.handlers)} enabled handlers: {self.correction_result.metadata['enabled_handlers']}"
312
- )
313
-
314
- # Restore audio hash
315
- if audio_hash:
316
- if not self.correction_result.metadata:
317
- self.correction_result.metadata = {}
318
- self.correction_result.metadata["audio_hash"] = audio_hash
319
-
320
177
  return {"status": "success", "data": self.correction_result.to_dict()}
321
178
  except Exception as e:
322
179
  self.logger.error(f"Failed to update handlers: {str(e)}")
@@ -382,107 +239,25 @@ class ReviewServer:
382
239
  async def add_lyrics(self, data: Dict[str, str] = Body(...)):
383
240
  """Add new lyrics source and rerun correction."""
384
241
  try:
385
- # Store existing audio hash
386
- audio_hash = self.correction_result.metadata.get("audio_hash") if self.correction_result.metadata else None
387
-
388
242
  source = data.get("source", "").strip()
389
243
  lyrics_text = data.get("lyrics", "").strip()
390
244
 
391
245
  self.logger.info(f"Received request to add lyrics source '{source}' with {len(lyrics_text)} characters")
392
246
 
393
- if not source or not lyrics_text:
394
- self.logger.warning("Invalid request: missing source or lyrics text")
395
- raise HTTPException(status_code=400, detail="Source name and lyrics text are required")
396
-
397
- # Validate source name isn't already used
398
- if source in self.correction_result.reference_lyrics:
399
- self.logger.warning(f"Source name '{source}' is already in use")
400
- raise HTTPException(status_code=400, detail=f"Source name '{source}' is already in use")
401
-
402
- # Create lyrics data using the provider
403
- self.logger.info("Creating LyricsData using UserInputProvider")
404
- provider = UserInputProvider(
405
- lyrics_text=lyrics_text, source_name=source, metadata=self.correction_result.metadata or {}, logger=self.logger
406
- )
407
- lyrics_data = provider._convert_result_format({"text": lyrics_text, "metadata": self.correction_result.metadata or {}})
408
- self.logger.info(f"Created LyricsData with {len(lyrics_data.segments)} segments")
409
-
410
- # Add to reference lyrics
411
- self.logger.info(f"Adding new source '{source}' to reference_lyrics")
412
- self.correction_result.reference_lyrics[source] = lyrics_data
413
- self.logger.info(f"Now have {len(self.correction_result.reference_lyrics)} total reference sources")
414
-
415
- # Create TranscriptionData from original segments
416
- self.logger.info("Creating TranscriptionData from original segments")
417
- transcription_data = TranscriptionData(
418
- segments=self.correction_result.original_segments,
419
- words=[word for segment in self.correction_result.original_segments for word in segment.words],
420
- text="\n".join(segment.text for segment in self.correction_result.original_segments),
421
- source="original",
422
- )
423
-
424
- # Get currently enabled handlers from metadata
425
- enabled_handlers = None
426
- if self.correction_result.metadata:
427
- if "enabled_handlers" in self.correction_result.metadata:
428
- enabled_handlers = self.correction_result.metadata["enabled_handlers"]
429
- self.logger.info(f"Found existing enabled handlers in metadata: {enabled_handlers}")
430
- elif "available_handlers" in self.correction_result.metadata:
431
- # If no enabled_handlers but we have available_handlers, enable all default handlers
432
- enabled_handlers = [
433
- handler["id"] for handler in self.correction_result.metadata["available_handlers"] if handler.get("enabled", True)
434
- ]
435
- self.logger.info(f"No enabled handlers found in metadata, using default enabled handlers: {enabled_handlers}")
436
- else:
437
- self.logger.warning("No handler configuration found in metadata")
438
-
439
- # Log reference sources before correction
440
- for source, lyrics in self.correction_result.reference_lyrics.items():
441
- word_count = sum(len(s.words) for s in lyrics.segments)
442
- self.logger.info(f"Reference source '{source}': {word_count} words in {len(lyrics.segments)} segments")
443
-
444
- # Rerun correction with updated reference lyrics
445
- self.logger.info("Initializing LyricsCorrector for re-correction")
446
- self.logger.info(f"Passing enabled handlers to corrector: {enabled_handlers or '[]'}")
447
- corrector = LyricsCorrector(
247
+ # Use shared operation for adding lyrics source
248
+ self.correction_result = CorrectionOperations.add_lyrics_source(
249
+ correction_result=self.correction_result,
250
+ source=source,
251
+ lyrics_text=lyrics_text,
448
252
  cache_dir=self.output_config.cache_dir,
449
- enabled_handlers=enabled_handlers, # Pass the preserved handlers or None to use defaults
450
- logger=self.logger,
451
- )
452
-
453
- self.logger.info(f"Active correction handlers: {[h.__class__.__name__ for h in corrector.handlers]}")
454
- self.logger.info("Running correction with updated reference lyrics")
455
- self.correction_result = corrector.run(
456
- transcription_results=[TranscriptionResult(name="original", priority=1, result=transcription_data)],
457
- lyrics_results=self.correction_result.reference_lyrics,
458
- metadata=self.correction_result.metadata,
459
- )
460
-
461
- # Update metadata with the new handler state from corrector
462
- if not self.correction_result.metadata:
463
- self.correction_result.metadata = {}
464
- self.correction_result.metadata.update(
465
- {
466
- "available_handlers": corrector.all_handlers,
467
- "enabled_handlers": [getattr(handler, "name", handler.__class__.__name__) for handler in corrector.handlers],
468
- }
469
- )
470
-
471
- # Restore audio hash
472
- if audio_hash:
473
- if not self.correction_result.metadata:
474
- self.correction_result.metadata = {}
475
- self.correction_result.metadata["audio_hash"] = audio_hash
476
-
477
- self.logger.info("Correction process completed")
478
- self.logger.info(
479
- f"Updated metadata with {len(corrector.handlers)} enabled handlers: {self.correction_result.metadata['enabled_handlers']}"
253
+ logger=self.logger
480
254
  )
481
255
 
482
256
  return {"status": "success", "data": self.correction_result.to_dict()}
483
257
 
484
- except HTTPException:
485
- raise
258
+ except ValueError as e:
259
+ # Convert ValueError to HTTPException for API consistency
260
+ raise HTTPException(status_code=400, detail=str(e))
486
261
  except Exception as e:
487
262
  self.logger.error(f"Failed to add lyrics: {str(e)}", exc_info=True)
488
263
  raise HTTPException(status_code=500, detail=str(e))
@@ -72,6 +72,11 @@ class AudioShakeAPI:
72
72
  start_time = time.time()
73
73
  last_status_log = start_time
74
74
  timeout_seconds = self.config.timeout_minutes * 60
75
+
76
+ # Add initial retry logic for 404 errors (job ID not yet available)
77
+ initial_retry_count = 0
78
+ max_initial_retries = 5
79
+ initial_retry_delay = 2 # seconds
75
80
 
76
81
  while True:
77
82
  current_time = time.time()
@@ -86,14 +91,29 @@ class AudioShakeAPI:
86
91
  self.logger.info(f"Still waiting for transcription... " f"Elapsed time: {int(elapsed_time/60)} minutes")
87
92
  last_status_log = current_time
88
93
 
89
- response = requests.get(url, headers=self._get_headers())
90
- response.raise_for_status()
91
- job_data = response.json()["job"]
92
-
93
- if job_data["status"] == "completed":
94
- return job_data
95
- elif job_data["status"] == "failed":
96
- raise TranscriptionError(f"Job failed: {job_data.get('error', 'Unknown error')}")
94
+ try:
95
+ response = requests.get(url, headers=self._get_headers())
96
+ response.raise_for_status()
97
+ job_data = response.json()["job"]
98
+
99
+ if job_data["status"] == "completed":
100
+ return job_data
101
+ elif job_data["status"] == "failed":
102
+ raise TranscriptionError(f"Job failed: {job_data.get('error', 'Unknown error')}")
103
+
104
+ # Reset retry count on successful response
105
+ initial_retry_count = 0
106
+
107
+ except requests.exceptions.HTTPError as e:
108
+ if e.response.status_code == 404 and initial_retry_count < max_initial_retries:
109
+ # Job ID not yet available, retry with delay
110
+ initial_retry_count += 1
111
+ self.logger.info(f"Job ID not yet available (attempt {initial_retry_count}/{max_initial_retries}), retrying in {initial_retry_delay} seconds...")
112
+ time.sleep(initial_retry_delay)
113
+ continue
114
+ else:
115
+ # Re-raise the error if it's not a 404 or we've exceeded retries
116
+ raise
97
117
 
98
118
  time.sleep(5) # Wait before next poll
99
119
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: lyrics-transcriber
3
- Version: 0.56.1
3
+ Version: 0.57.1
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
@@ -19,6 +19,7 @@ lyrics_transcriber/correction/handlers/sound_alike.py,sha256=75IvDSfoGUG2xVbYp-x
19
19
  lyrics_transcriber/correction/handlers/syllables_match.py,sha256=c9_hrJb_xkkqd2SuDjrsSmUF7OMYV65LRzBfAhCHxEY,11217
20
20
  lyrics_transcriber/correction/handlers/word_count_match.py,sha256=OltTEs6eYnslxdvak97M5gXDiqXJxMHKk__Q9F_akXc,3595
21
21
  lyrics_transcriber/correction/handlers/word_operations.py,sha256=410xhyO9tiqezV5yd5JKwKbxSGwXK9LWHJ7-zNIuOWA,7423
22
+ lyrics_transcriber/correction/operations.py,sha256=k5N8w_8BeR7CXiclaJ3zuu_g2KLoWSnnuD4OAmY3kJs,14010
22
23
  lyrics_transcriber/correction/phrase_analyzer.py,sha256=dtO_2LjxnPdHJM7De40mYIdHCkozwhizVVQp5XGO7x0,16962
23
24
  lyrics_transcriber/correction/text_utils.py,sha256=7QHK6-PY7Rx1G1E31sWiLBw00mHorRDo-M44KMHFaZs,833
24
25
  lyrics_transcriber/frontend/.gitignore,sha256=lgGIPiVpFVUNSZl9oNQLelLOWUzpF7sikLW8xmsrrqI,248
@@ -28,7 +29,7 @@ lyrics_transcriber/frontend/README.md,sha256=-D6CAfKTT7Y0V3EjlZ2fMy7fyctFQ4x2TJ9
28
29
  lyrics_transcriber/frontend/__init__.py,sha256=nW8acRSWTjXoRwGqcTU4w-__X7tMAE0iXL0uihBN3CU,836
29
30
  lyrics_transcriber/frontend/eslint.config.js,sha256=3ADH23ANA4NNBKFy6nCVk65e8bx1DrVd_FIaYNnhuqA,734
30
31
  lyrics_transcriber/frontend/index.html,sha256=KfqJVONzpUyPIwV73nZRiCWlwLnFWeB3z0vzxDPNudU,376
31
- lyrics_transcriber/frontend/package.json,sha256=JzRDyUtrgx5hQN6hBA17rAMINl1BeV8rcw-0bXhNoOI,1182
32
+ lyrics_transcriber/frontend/package.json,sha256=ymT_LojRz3lHym2cts2amV_qHGUKDhjY2EyI4XXuTac,1182
32
33
  lyrics_transcriber/frontend/public/vite.svg,sha256=SnSK_UQ5GLsWWRyDTEAdrjPoeGGrXbrQgRw6O0qSFPs,1497
33
34
  lyrics_transcriber/frontend/src/App.tsx,sha256=f1-dp-MU8vap18eAXacwVDO5P4eE2iG9zSvjau-7NJs,6533
34
35
  lyrics_transcriber/frontend/src/api.ts,sha256=UgqPc1jo8DEVgxh3_9Lyf9GBsHYpqMAqsPEE5BzTV4w,6640
@@ -82,9 +83,9 @@ lyrics_transcriber/frontend/update_version.js,sha256=PxkqCnsucXnXiIqutsanVcx00Gq
82
83
  lyrics_transcriber/frontend/vite.config.d.ts,sha256=S5bdGf0pSdKM6A6RNBKwAm3EIeW_bDHYfHtesRtXU7Q,76
83
84
  lyrics_transcriber/frontend/vite.config.js,sha256=P4GuPgRZzwEWPQZpyujUe7eA3mjPoFAe2CgE5sQAXg8,232
84
85
  lyrics_transcriber/frontend/vite.config.ts,sha256=8FdW0dN8zDFqfhQSxX5h7sIu72X2piLYlp_TZYRQvBQ,216
85
- lyrics_transcriber/frontend/web_assets/assets/index-C6nHrD6T.js,sha256=paYEcHmp8RNb0NAVhBcZ86DCoIAONO0fmrflDB-zRuo,1257959
86
- lyrics_transcriber/frontend/web_assets/assets/index-C6nHrD6T.js.map,sha256=9Ug5yJWI2nOfdtf-jq2QJQKpOhNlURvdMUuV30MROOg,2678465
87
- lyrics_transcriber/frontend/web_assets/index.html,sha256=v4BmuDAfI38fNm9V12D5pkFtXMFlMwdrPQXNYidR_lA,400
86
+ lyrics_transcriber/frontend/web_assets/assets/index-BEnewYea.js,sha256=ZnG1iyUgNqX3Gg9p4TlPYCFBc3vBmtZsLEZCwHP_QN4,1257959
87
+ lyrics_transcriber/frontend/web_assets/assets/index-BEnewYea.js.map,sha256=4pt7ACRxm4ESXGPfo24LK3V_QeGJiBnwJ3P9zYFF1jA,2678465
88
+ lyrics_transcriber/frontend/web_assets/index.html,sha256=iCKFH8jSOUw3Obz8mdV4OcUE8LS7H9dsttNaYVCLiQc,400
88
89
  lyrics_transcriber/frontend/web_assets/vite.svg,sha256=SnSK_UQ5GLsWWRyDTEAdrjPoeGGrXbrQgRw6O0qSFPs,1497
89
90
  lyrics_transcriber/frontend/yarn.lock,sha256=wtImLsCO1P1Lpkhc1jAN6IiHQ0As4xn39n0cwKoh4LM,131996
90
91
  lyrics_transcriber/lyrics/base_lyrics_provider.py,sha256=mqlqssKG2AofvqEU48nCwLnz0FhO9Ee6MNixF6GBnYY,9133
@@ -143,16 +144,16 @@ lyrics_transcriber/output/segment_resizer.py,sha256=rrgcQC28eExSAmGnm6ytkF-E-nH4
143
144
  lyrics_transcriber/output/subtitles.py,sha256=yQCR7YO3aitKnGRjfAtSwsdi6byfpEZgnCumJO16M2E,19085
144
145
  lyrics_transcriber/output/video.py,sha256=L_KB33YM4X-EQBRcLIPO4ZqlNEcVwqTWKjaJZVtkN-4,13751
145
146
  lyrics_transcriber/review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
- lyrics_transcriber/review/server.py,sha256=sdmoM6GU0VlVeeCks4UxrOONN18dGDmbbcqK-4Soj7U,27480
147
+ lyrics_transcriber/review/server.py,sha256=WXWyJZJsKm6_HhGxRdP2fD7kyMAmuc_I-Kvqx_uA4NI,14833
147
148
  lyrics_transcriber/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
149
  lyrics_transcriber/storage/dropbox.py,sha256=Dyam1ULTkoxD1X5trkZ5dGp5XhBGCn998moC8IS9-68,9804
149
- lyrics_transcriber/transcribers/audioshake.py,sha256=hLlnRfkYldP8Y0dMCCwjYlLwqUZPAP7Xzk59G3u5bq0,8939
150
+ lyrics_transcriber/transcribers/audioshake.py,sha256=7DggSTMPkCnDKIVy-GsI8q_tQKc8S4p5oCU-O1DM8hc,9934
150
151
  lyrics_transcriber/transcribers/base_transcriber.py,sha256=T3m4ZCwZ9Bpv6Jvb2hNcnllk-lmeNmADDJlSySBtP1Q,6480
151
152
  lyrics_transcriber/transcribers/whisper.py,sha256=YcCB1ic9H6zL1GS0jD0emu8-qlcH0QVEjjjYB4aLlIQ,13260
152
153
  lyrics_transcriber/types.py,sha256=wqFrTKhb8qAUB48zH-51_EEGCGrxm0Ji-ETfQumtSKc,27666
153
154
  lyrics_transcriber/utils/word_utils.py,sha256=-cMGpj9UV4F6IsoDKAV2i1aiqSO8eI91HMAm_igtVMk,958
154
- lyrics_transcriber-0.56.1.dist-info/LICENSE,sha256=81R_4XwMZDODHD7JcZeUR8IiCU8AD7Ajl6bmwR9tYDk,1074
155
- lyrics_transcriber-0.56.1.dist-info/METADATA,sha256=MKOe0GrscQmRlhBtixhOngpCp6d6iitRYGvVBmhO4CQ,6637
156
- lyrics_transcriber-0.56.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
157
- lyrics_transcriber-0.56.1.dist-info/entry_points.txt,sha256=kcp-bSFkCACAEA0t166Kek0HpaJUXRo5SlF5tVrqNBU,216
158
- lyrics_transcriber-0.56.1.dist-info/RECORD,,
155
+ lyrics_transcriber-0.57.1.dist-info/LICENSE,sha256=81R_4XwMZDODHD7JcZeUR8IiCU8AD7Ajl6bmwR9tYDk,1074
156
+ lyrics_transcriber-0.57.1.dist-info/METADATA,sha256=F9jLN9OeynKJgr2cfgO8gDMJMTTj2cOmSn_K8WK_ISU,6637
157
+ lyrics_transcriber-0.57.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
158
+ lyrics_transcriber-0.57.1.dist-info/entry_points.txt,sha256=kcp-bSFkCACAEA0t166Kek0HpaJUXRo5SlF5tVrqNBU,216
159
+ lyrics_transcriber-0.57.1.dist-info/RECORD,,