lyrics-transcriber 0.32.2__py3-none-any.whl → 0.33.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.
@@ -60,19 +60,24 @@ def create_arg_parser() -> argparse.ArgumentParser:
60
60
  output_group.add_argument(
61
61
  "--cache_dir",
62
62
  type=Path,
63
- help="Directory to cache downloaded/generated files. Default: /tmp/lyrics-transcriber-cache/",
63
+ help="Directory to cache downloaded/generated files. Default: ~/lyrics-transcriber-cache/",
64
64
  )
65
65
  output_group.add_argument(
66
66
  "--output_styles_json",
67
67
  type=Path,
68
68
  help="JSON file containing output style configurations for CDG and video generation",
69
69
  )
70
- output_group.add_argument("--generate_cdg", action="store_true", help="Generate CDG karaoke files")
71
70
 
72
- # Video options
73
- video_group = parser.add_argument_group("Video Options")
74
- video_group.add_argument("--render_video", action="store_true", help="Render a karaoke video with the generated lyrics")
75
- video_group.add_argument(
71
+ # Feature control group
72
+ feature_group = parser.add_argument_group("Feature Control")
73
+ feature_group.add_argument("--skip_lyrics_fetch", action="store_true", help="Skip fetching lyrics from online sources")
74
+ feature_group.add_argument("--skip_transcription", action="store_true", help="Skip audio transcription process")
75
+ feature_group.add_argument("--skip_correction", action="store_true", help="Skip lyrics correction process")
76
+ feature_group.add_argument("--skip_plain_text", action="store_true", help="Skip generating plain text output files")
77
+ feature_group.add_argument("--skip_lrc", action="store_true", help="Skip generating LRC file")
78
+ feature_group.add_argument("--skip_cdg", action="store_true", help="Skip generating CDG karaoke files")
79
+ feature_group.add_argument("--skip_video", action="store_true", help="Skip rendering karaoke video")
80
+ feature_group.add_argument(
76
81
  "--video_resolution", choices=["4k", "1080p", "720p", "360p"], default="360p", help="Resolution of the karaoke video. Default: 360p"
77
82
  )
78
83
 
@@ -86,7 +91,7 @@ def parse_args(parser: argparse.ArgumentParser, args_list: list[str] | None = No
86
91
 
87
92
  # Set default cache_dir if not provided
88
93
  if not hasattr(args, "cache_dir") or args.cache_dir is None:
89
- args.cache_dir = Path(os.getenv("LYRICS_TRANSCRIBER_CACHE_DIR", "/tmp/lyrics-transcriber-cache/"))
94
+ args.cache_dir = Path(os.getenv("LYRICS_TRANSCRIBER_CACHE_DIR", os.path.join(os.path.expanduser("~"), "lyrics-transcriber-cache")))
90
95
 
91
96
  return args
92
97
 
@@ -135,9 +140,14 @@ def create_configs(args: argparse.Namespace, env_config: Dict[str, str]) -> tupl
135
140
  output_styles_json=str(args.output_styles_json),
136
141
  output_dir=str(args.output_dir) if args.output_dir else os.getcwd(),
137
142
  cache_dir=str(args.cache_dir),
138
- render_video=args.render_video,
139
- generate_cdg=args.generate_cdg,
140
143
  video_resolution=args.video_resolution,
144
+ fetch_lyrics=not args.skip_lyrics_fetch,
145
+ run_transcription=not args.skip_transcription,
146
+ run_correction=not args.skip_correction,
147
+ generate_plain_text=not args.skip_plain_text,
148
+ generate_lrc=not args.skip_lrc,
149
+ generate_cdg=not args.skip_cdg,
150
+ render_video=not args.skip_video,
141
151
  )
142
152
 
143
153
  return transcriber_config, lyrics_config, output_config
@@ -28,8 +28,18 @@ class OutputConfig:
28
28
  max_line_length: int = 36
29
29
  styles: Dict[str, Any] = field(default_factory=dict)
30
30
  output_dir: Optional[str] = os.getcwd()
31
- cache_dir: str = os.getenv("LYRICS_TRANSCRIBER_CACHE_DIR", "/tmp/lyrics-transcriber-cache/")
32
- render_video: bool = False
33
- generate_cdg: bool = False
34
- video_resolution: str = "360p"
31
+ cache_dir: str = os.getenv(
32
+ "LYRICS_TRANSCRIBER_CACHE_DIR",
33
+ os.path.join(os.path.expanduser("~"), "lyrics-transcriber-cache")
34
+ )
35
+
36
+ fetch_lyrics: bool = True
37
+ run_transcription: bool = True
38
+ run_correction: bool = True
35
39
  enable_review: bool = True
40
+
41
+ generate_plain_text: bool = True
42
+ generate_lrc: bool = True
43
+ generate_cdg: bool = True
44
+ render_video: bool = True
45
+ video_resolution: str = "360p"
@@ -1,12 +1,10 @@
1
+ import difflib
2
+ import json
1
3
  import os
2
4
  import logging
3
5
  from dataclasses import dataclass, field
4
6
  from typing import Dict, Optional, List
5
- from lyrics_transcriber.types import (
6
- LyricsData,
7
- TranscriptionResult,
8
- CorrectionResult,
9
- )
7
+ from lyrics_transcriber.types import LyricsData, PhraseType, TranscriptionResult, CorrectionResult, AnchorSequence, GapSequence, PhraseScore
10
8
  from lyrics_transcriber.transcribers.base_transcriber import BaseTranscriber
11
9
  from lyrics_transcriber.transcribers.audioshake import AudioShakeTranscriber, AudioShakeConfig
12
10
  from lyrics_transcriber.transcribers.whisper import WhisperTranscriber, WhisperConfig
@@ -83,6 +81,16 @@ class LyricsTranscriber:
83
81
  self.lyrics_config = lyrics_config or LyricsConfig()
84
82
  self.output_config = output_config or OutputConfig()
85
83
 
84
+ # Check if styles JSON is available for CDG and video features
85
+ if not self.output_config.output_styles_json or not os.path.exists(self.output_config.output_styles_json):
86
+ if self.output_config.generate_cdg or self.output_config.render_video:
87
+ self.logger.warning(
88
+ f"Output styles JSON file not found: {self.output_config.output_styles_json}. "
89
+ "CDG and video generation will be disabled."
90
+ )
91
+ self.output_config.generate_cdg = False
92
+ self.output_config.render_video = False
93
+
86
94
  # Basic settings
87
95
  self.audio_filepath = audio_filepath
88
96
  self.artist = artist
@@ -106,6 +114,18 @@ class LyricsTranscriber:
106
114
  self.corrector = corrector or LyricsCorrector(cache_dir=self.output_config.cache_dir, logger=self.logger)
107
115
  self.output_generator = output_generator or self._initialize_output_generator()
108
116
 
117
+ # Log enabled features
118
+ self.logger.info("Enabled features:")
119
+ self.logger.info(f" Lyrics fetching: {'enabled' if self.output_config.fetch_lyrics else 'disabled'}")
120
+ self.logger.info(f" Transcription: {'enabled' if self.output_config.run_transcription else 'disabled'}")
121
+ self.logger.info(f" Lyrics correction: {'enabled' if self.output_config.run_correction else 'disabled'}")
122
+ self.logger.info(f" Plain text output: {'enabled' if self.output_config.generate_plain_text else 'disabled'}")
123
+ self.logger.info(f" LRC file generation: {'enabled' if self.output_config.generate_lrc else 'disabled'}")
124
+ self.logger.info(f" CDG file generation: {'enabled' if self.output_config.generate_cdg else 'disabled'}")
125
+ self.logger.info(f" Video rendering: {'enabled' if self.output_config.render_video else 'disabled'}")
126
+ if self.output_config.render_video:
127
+ self.logger.info(f" Video resolution: {self.output_config.video_resolution}")
128
+
109
129
  def _initialize_transcribers(self) -> Dict[str, BaseTranscriber]:
110
130
  """Initialize available transcription services."""
111
131
  transcribers = {}
@@ -175,26 +195,21 @@ class LyricsTranscriber:
175
195
  return OutputGenerator(config=self.output_config, logger=self.logger)
176
196
 
177
197
  def process(self) -> LyricsControllerResult:
178
- """
179
- Main processing method that orchestrates the entire workflow.
180
-
181
- Returns:
182
- LyricsControllerResult containing all outputs and generated files.
198
+ """Main processing method that orchestrates the entire workflow."""
183
199
 
184
- Raises:
185
- Exception: If a critical error occurs during processing.
186
- """
187
- # Step 1: Fetch lyrics if artist and title are provided
188
- if self.artist and self.title:
200
+ # Step 1: Fetch lyrics if enabled and artist/title are provided
201
+ if self.output_config.fetch_lyrics and self.artist and self.title:
189
202
  self.fetch_lyrics()
190
203
 
191
- # Step 2: Run transcription
192
- self.transcribe()
204
+ # Step 2: Run transcription if enabled
205
+ if self.output_config.run_transcription:
206
+ self.transcribe()
193
207
 
194
- # Step 3: Process and correct lyrics
195
- self.correct_lyrics()
208
+ # Step 3: Process and correct lyrics if enabled
209
+ if self.output_config.run_correction:
210
+ self.correct_lyrics()
196
211
 
197
- # Step 4: Generate outputs
212
+ # Step 4: Generate outputs based on what's enabled and available
198
213
  self.generate_outputs()
199
214
 
200
215
  self.logger.info("Processing completed successfully")
@@ -239,7 +254,32 @@ class LyricsTranscriber:
239
254
  """Run lyrics correction using transcription and internet lyrics."""
240
255
  self.logger.info("Starting lyrics correction process")
241
256
 
242
- # Run correction
257
+ # Check if we have reference lyrics to work with
258
+ if not self.results.lyrics_results:
259
+ self.logger.warning("No reference lyrics available for correction - using raw transcription")
260
+ # Use the highest priority transcription result as the "corrected" version
261
+ if self.results.transcription_results:
262
+ sorted_results = sorted(self.results.transcription_results, key=lambda x: x.priority)
263
+ best_transcription = sorted_results[0]
264
+
265
+ # Create a CorrectionResult with no corrections
266
+ self.results.transcription_corrected = CorrectionResult(
267
+ original_segments=best_transcription.result.segments,
268
+ corrected_segments=best_transcription.result.segments,
269
+ corrected_text="", # Will be generated from segments
270
+ corrections=[], # No corrections made
271
+ corrections_made=0, # No corrections made
272
+ confidence=1.0, # Full confidence since we're using original
273
+ transcribed_text="", # Will be generated from segments
274
+ reference_texts={},
275
+ anchor_sequences=[],
276
+ gap_sequences=[],
277
+ resized_segments=[], # Will be populated later
278
+ metadata={"correction_type": "none", "reason": "no_reference_lyrics"},
279
+ )
280
+ return
281
+
282
+ # Run correction if we have reference lyrics
243
283
  corrected_data = self.corrector.run(
244
284
  transcription_results=self.results.transcription_results, lyrics_results=self.results.lyrics_results
245
285
  )
@@ -249,19 +289,60 @@ class LyricsTranscriber:
249
289
  self.logger.info("Lyrics correction completed")
250
290
 
251
291
  # Add human review step
252
- if self.output_config.enable_review: # We'll need to add this config option
292
+ if self.output_config.enable_review:
253
293
  from ..review import start_review_server
294
+ import json
295
+ from copy import deepcopy
254
296
 
255
297
  self.logger.info("Starting human review process")
256
- self.results.transcription_corrected = start_review_server(corrected_data)
298
+
299
+ def normalize_data(data_dict):
300
+ """Normalize numeric values in the data structure before JSON conversion."""
301
+ if isinstance(data_dict, dict):
302
+ return {k: normalize_data(v) for k, v in data_dict.items()}
303
+ elif isinstance(data_dict, list):
304
+ return [normalize_data(item) for item in data_dict]
305
+ elif isinstance(data_dict, float):
306
+ # Convert whole number floats to integers
307
+ if data_dict.is_integer():
308
+ return int(data_dict)
309
+ return data_dict
310
+ return data_dict
311
+
312
+ # Normalize and convert auto-corrected data
313
+ auto_data = normalize_data(deepcopy(self.results.transcription_corrected.to_dict()))
314
+ auto_corrected_json = json.dumps(auto_data, indent=4).splitlines()
315
+
316
+ # Pass through review server
317
+ reviewed_data = start_review_server(self.results.transcription_corrected)
318
+
319
+ # Normalize and convert reviewed data
320
+ human_data = normalize_data(deepcopy(reviewed_data.to_dict()))
321
+ human_corrected_json = json.dumps(human_data, indent=4).splitlines()
322
+
257
323
  self.logger.info("Human review completed")
258
324
 
325
+ # Compare the normalized JSON strings
326
+ diff = list(
327
+ difflib.unified_diff(auto_corrected_json, human_corrected_json, fromfile="auto-corrected", tofile="human-corrected")
328
+ )
329
+
330
+ if diff:
331
+ self.logger.warning("Changes made by human review:")
332
+ for line in diff:
333
+ self.logger.warning(line.rstrip())
334
+
335
+ # exit(1)
336
+
259
337
  def generate_outputs(self) -> None:
260
- """Generate output files."""
338
+ """Generate output files based on enabled features and available data."""
261
339
  self.logger.info("Generating output files")
262
340
 
341
+ # Only proceed with outputs that make sense based on what we have
342
+ has_correction = bool(self.results.transcription_corrected)
343
+
263
344
  output_files = self.output_generator.generate_outputs(
264
- transcription_corrected=self.results.transcription_corrected,
345
+ transcription_corrected=self.results.transcription_corrected if has_correction else None,
265
346
  lyrics_results=self.results.lyrics_results,
266
347
  output_prefix=self.output_prefix,
267
348
  audio_filepath=self.audio_filepath,
@@ -269,7 +350,7 @@ class LyricsTranscriber:
269
350
  title=self.title,
270
351
  )
271
352
 
272
- # Store all output paths in results
353
+ # Store results
273
354
  self.results.lrc_filepath = output_files.lrc
274
355
  self.results.ass_filepath = output_files.ass
275
356
  self.results.video_filepath = output_files.video
@@ -21,10 +21,19 @@ class PhraseAnalyzer:
21
21
  try:
22
22
  self.nlp = spacy.load(language_code)
23
23
  except OSError:
24
- self.logger.error(f"Failed to load language model: {language_code}")
25
- raise OSError(
26
- f"Language model '{language_code}' not found. " f"Please install it with: python -m spacy download {language_code}"
27
- )
24
+ self.logger.info(f"Language model {language_code} not found. Attempting to download...")
25
+ import subprocess
26
+
27
+ try:
28
+ subprocess.check_call(["python", "-m", "spacy", "download", language_code])
29
+ self.nlp = spacy.load(language_code)
30
+ self.logger.info(f"Successfully downloaded and loaded {language_code}")
31
+ except subprocess.CalledProcessError as e:
32
+ self.logger.error(f"Failed to download language model: {language_code}")
33
+ raise OSError(
34
+ f"Language model '{language_code}' could not be downloaded. "
35
+ f"Please install it manually with: python -m spacy download {language_code}"
36
+ ) from e
28
37
 
29
38
  def score_phrase(self, words: List[str], context: str) -> PhraseScore:
30
39
  """Score a phrase based on grammatical completeness and natural breaks.
@@ -123,8 +123,9 @@ class SegmentResizer:
123
123
  LyricsSegment(text="Here's another one.", ...)
124
124
  ]
125
125
  """
126
- self.logger.info(f"Processing oversized segment {segment_idx}: '{segment.text}'")
127
126
  segment_text = self._clean_text(segment.text)
127
+
128
+ self.logger.info(f"Processing oversized segment {segment_idx}: '{segment_text}'")
128
129
  split_lines = self._process_segment_text(segment_text)
129
130
  self.logger.debug(f"Split into {len(split_lines)} lines: {split_lines}")
130
131
 
@@ -163,7 +164,7 @@ class SegmentResizer:
163
164
  if word_pos != -1:
164
165
  line_words.append(words_to_process.pop(0))
165
166
  # Remove the word and any following spaces from remaining line
166
- remaining_line = remaining_line[word_pos + len(word_clean):].strip()
167
+ remaining_line = remaining_line[word_pos + len(word_clean) :].strip()
167
168
  continue
168
169
 
169
170
  # If we can't find the word in the remaining line, we're done with this line
@@ -2,7 +2,7 @@ import logging
2
2
  from fastapi import FastAPI, Body
3
3
  from fastapi.middleware.cors import CORSMiddleware
4
4
  from typing import Optional, Dict, Any
5
- from ..types import CorrectionResult
5
+ from ..types import CorrectionResult, WordCorrection, LyricsSegment
6
6
  import time
7
7
  import subprocess
8
8
  import os
@@ -64,16 +64,22 @@ async def complete_review(updated_data: Dict[str, Any] = Body(...)):
64
64
  Mark the review as complete and update the correction data.
65
65
 
66
66
  Args:
67
- updated_data: The complete correction result data with any modifications
67
+ updated_data: Dictionary containing corrections and corrected_segments
68
68
  """
69
69
  global review_completed, current_review
70
70
 
71
71
  logger.info("Received updated correction data")
72
72
 
73
73
  try:
74
- # Update the current review with modified data
75
- # We use from_dict to ensure the data is properly structured
76
- current_review = CorrectionResult.from_dict(updated_data)
74
+ # Only update the specific fields that were modified
75
+ if current_review is None:
76
+ raise ValueError("No review in progress")
77
+
78
+ # Update only the corrections and corrected_segments
79
+ current_review.corrections = [WordCorrection.from_dict(c) for c in updated_data["corrections"]]
80
+ current_review.corrected_segments = [LyricsSegment.from_dict(s) for s in updated_data["corrected_segments"]]
81
+ current_review.corrections_made = len(current_review.corrections)
82
+
77
83
  logger.info(f"Successfully updated correction data with {len(current_review.corrections)} corrections")
78
84
 
79
85
  review_completed = True
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: lyrics-transcriber
3
- Version: 0.32.2
3
+ Version: 0.33.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
@@ -1,9 +1,9 @@
1
1
  lyrics_transcriber/__init__.py,sha256=JpdjDK1MH_Be2XiSQWnb4i5Bbil1uPMA_KcuDZ3cyUI,240
2
2
  lyrics_transcriber/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- lyrics_transcriber/cli/cli_main.py,sha256=pquvPfhw6brNgUyMuAzXfCUXNN0NM5tP_MyxlLWqNPc,8968
3
+ lyrics_transcriber/cli/cli_main.py,sha256=TFB7CwzgLuwPfoV7ggPPe5dh4WKNcWRoZkCu_WWUcLQ,9818
4
4
  lyrics_transcriber/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- lyrics_transcriber/core/config.py,sha256=eddocVn_VoBGRqgBzfSvO7EZp3NuoGfSmd6mcT8wa74,941
6
- lyrics_transcriber/core/controller.py,sha256=eQ0M67SWIA-hr23fkw6F8hmqKkklOHsxOsJnYQLXFBE,12184
5
+ lyrics_transcriber/core/config.py,sha256=y6MsAL0gFz7zRErtRRF81Z0vFOrySIrCw2aKDHExBz8,1160
6
+ lyrics_transcriber/core/controller.py,sha256=t1jUCSJWHZgYurdGKEbyAqDNG5PTNkgiVueDqIzG06k,17149
7
7
  lyrics_transcriber/correction/anchor_sequence.py,sha256=YpKyY24Va5i4JgzP9ssqlOIkaYu060KaldiehbfgTdk,22200
8
8
  lyrics_transcriber/correction/corrector.py,sha256=VOM6YhbANu00rYs6JpKHGZXnZtD5fxArnYtRrsp1YM4,12998
9
9
  lyrics_transcriber/correction/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -17,7 +17,7 @@ lyrics_transcriber/correction/handlers/sound_alike.py,sha256=mAmnpRpO29rHaP96V-U
17
17
  lyrics_transcriber/correction/handlers/syllables_match.py,sha256=5M7-0A6G-eu4nyzxT0wiuUpN5zbqXq9d-zeTP7AdLfg,8377
18
18
  lyrics_transcriber/correction/handlers/word_count_match.py,sha256=zbyZ01VE_6azaFpi8rS0Ato7c_VBxM2KV83VnDH5t3c,2522
19
19
  lyrics_transcriber/correction/handlers/word_operations.py,sha256=2COTaJsEwpSWyXHXmGgjfcf2x7tbAnsQ0dIW0qyHYK4,5141
20
- lyrics_transcriber/correction/phrase_analyzer.py,sha256=D94Ytlo7U2eTHYJ_nCVLhafmtTYExKx6v2_aczOJaQ8,16455
20
+ lyrics_transcriber/correction/phrase_analyzer.py,sha256=dtO_2LjxnPdHJM7De40mYIdHCkozwhizVVQp5XGO7x0,16962
21
21
  lyrics_transcriber/correction/text_utils.py,sha256=VkOqgZHa9wEqLJdVNi4-KLFojQ6d4lWOGl_Y_vknenU,808
22
22
  lyrics_transcriber/lyrics/base_lyrics_provider.py,sha256=i4wxzu8nk2a3NDtnB_4r6rOGBZ7WvJFVlcEBjAkUYgI,5511
23
23
  lyrics_transcriber/lyrics/genius.py,sha256=M4rs3yk5RKW-RYfMm9w-UxwKQ8itgYeM-kVS6LCn8D0,3295
@@ -68,19 +68,19 @@ lyrics_transcriber/output/fonts/verdana.ttf,sha256=lu0UlJyktzks_yNbnEHVXBJTgqu-D
68
68
  lyrics_transcriber/output/generator.py,sha256=HQa3Ft8SKJie9-cYO0NKDbAU2-h_YnnH5wACxj0qFKw,7482
69
69
  lyrics_transcriber/output/lyrics_file.py,sha256=_KQyQjCOMIwQdQ0115uEAUIjQWTRmShkSfQuINPKxaw,3741
70
70
  lyrics_transcriber/output/plain_text.py,sha256=3mYKq0BLYz1rGBD6ROjG2dn6BPuzbn5dxIQbWZVi4ao,3689
71
- lyrics_transcriber/output/segment_resizer.py,sha256=xkKCNt4CTdTErUTYsYtjmllKY8YHny1srqQMrJQYbK8,17141
71
+ lyrics_transcriber/output/segment_resizer.py,sha256=b553FCdcjYAl9T1IA5K6ya0pcn1-irD5spmxSc26wnI,17143
72
72
  lyrics_transcriber/output/subtitles.py,sha256=BQy7N_2zdBBWEiHL0NWFz3ZgAerWqQvTLALgxxK3Etk,16920
73
73
  lyrics_transcriber/output/video.py,sha256=kYGeEMYtoJvrGnMuyNpuSmu2DTskGDXBNlrv6ddvC8I,8485
74
74
  lyrics_transcriber/review/__init__.py,sha256=_3Eqw-uXZhOZwo6_sHZLhP9vxAVkLF9EBXduUvPdLjQ,57
75
- lyrics_transcriber/review/server.py,sha256=iAG0WUkGrqnAF7dI4ZQQayp2qaamqGGYT6rWJF9OysI,4397
75
+ lyrics_transcriber/review/server.py,sha256=xUW55PhAeCKldXFm6F2X7waYid5vI_BsiPSoF4KnO0g,4744
76
76
  lyrics_transcriber/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  lyrics_transcriber/storage/dropbox.py,sha256=Dyam1ULTkoxD1X5trkZ5dGp5XhBGCn998moC8IS9-68,9804
78
78
  lyrics_transcriber/transcribers/audioshake.py,sha256=QzKGimVa6BovlvYFj35CbGpaGePI_DApAJGEBR_JQLc,8709
79
79
  lyrics_transcriber/transcribers/base_transcriber.py,sha256=yPzUWPTCGmzE97H5Rz6g61e-qEGL77ZzUoiBOmswhts,5973
80
80
  lyrics_transcriber/transcribers/whisper.py,sha256=P0kas2_oX16MO1-Qy7U5gl5KQN-RuUIJZz7LsEFLUiE,12906
81
81
  lyrics_transcriber/types.py,sha256=xGf3hkTRcGZTTAjMVIev2i2DOU6co0QGpW8NxvaBQAA,16759
82
- lyrics_transcriber-0.32.2.dist-info/LICENSE,sha256=BiPihPDxhxIPEx6yAxVfAljD5Bhm_XG2teCbPEj_m0Y,1069
83
- lyrics_transcriber-0.32.2.dist-info/METADATA,sha256=_eW3ZTF3vCxCPtfJRzKgedrQ8VmaL1b244mAlxO71tY,5856
84
- lyrics_transcriber-0.32.2.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
85
- lyrics_transcriber-0.32.2.dist-info/entry_points.txt,sha256=ChnmR13YoalGnC3sHW0TppX5FbhEXntYIha24tVQJ1M,104
86
- lyrics_transcriber-0.32.2.dist-info/RECORD,,
82
+ lyrics_transcriber-0.33.0.dist-info/LICENSE,sha256=BiPihPDxhxIPEx6yAxVfAljD5Bhm_XG2teCbPEj_m0Y,1069
83
+ lyrics_transcriber-0.33.0.dist-info/METADATA,sha256=2iT3ynJ2po1YYE1db_WX1XZBRrpQ-Z2-JJTkCP7nUAY,5856
84
+ lyrics_transcriber-0.33.0.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
85
+ lyrics_transcriber-0.33.0.dist-info/entry_points.txt,sha256=ChnmR13YoalGnC3sHW0TppX5FbhEXntYIha24tVQJ1M,104
86
+ lyrics_transcriber-0.33.0.dist-info/RECORD,,