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.
- lyrics_transcriber/cli/cli_main.py +19 -9
- lyrics_transcriber/core/config.py +14 -4
- lyrics_transcriber/core/controller.py +107 -26
- lyrics_transcriber/correction/phrase_analyzer.py +13 -4
- lyrics_transcriber/output/segment_resizer.py +3 -2
- lyrics_transcriber/review/server.py +11 -5
- {lyrics_transcriber-0.32.2.dist-info → lyrics_transcriber-0.33.0.dist-info}/METADATA +1 -1
- {lyrics_transcriber-0.32.2.dist-info → lyrics_transcriber-0.33.0.dist-info}/RECORD +11 -11
- {lyrics_transcriber-0.32.2.dist-info → lyrics_transcriber-0.33.0.dist-info}/LICENSE +0 -0
- {lyrics_transcriber-0.32.2.dist-info → lyrics_transcriber-0.33.0.dist-info}/WHEEL +0 -0
- {lyrics_transcriber-0.32.2.dist-info → lyrics_transcriber-0.33.0.dist-info}/entry_points.txt +0 -0
@@ -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:
|
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
|
-
#
|
73
|
-
|
74
|
-
|
75
|
-
|
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", "
|
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(
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
185
|
-
|
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.
|
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.
|
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
|
-
#
|
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:
|
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
|
-
|
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
|
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.
|
25
|
-
|
26
|
-
|
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:
|
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
|
-
#
|
75
|
-
|
76
|
-
|
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.
|
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=
|
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=
|
6
|
-
lyrics_transcriber/core/controller.py,sha256=
|
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=
|
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=
|
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=
|
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.
|
83
|
-
lyrics_transcriber-0.
|
84
|
-
lyrics_transcriber-0.
|
85
|
-
lyrics_transcriber-0.
|
86
|
-
lyrics_transcriber-0.
|
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,,
|
File without changes
|
File without changes
|
{lyrics_transcriber-0.32.2.dist-info → lyrics_transcriber-0.33.0.dist-info}/entry_points.txt
RENAMED
File without changes
|