lyrics-transcriber 0.16.2__tar.gz → 0.16.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (17) hide show
  1. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/PKG-INFO +2 -1
  2. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/transcriber.py +26 -13
  3. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/pyproject.toml +3 -2
  4. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/LICENSE +0 -0
  5. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/README.md +0 -0
  6. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/__init__.py +0 -0
  7. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/audioshake_transcriber.py +0 -0
  8. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/llm_prompts/README.md +0 -0
  9. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/llm_prompts/llm_prompt_lyrics_correction_andrew_handwritten_20231118.txt +0 -0
  10. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/llm_prompts/llm_prompt_lyrics_correction_gpt_optimised_20231119.txt +0 -0
  11. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/llm_prompts/llm_prompt_lyrics_matching_andrew_handwritten_20231118.txt +0 -0
  12. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/llm_prompts/promptfooconfig.yaml +0 -0
  13. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/llm_prompts/test_data/ABBA-UnderAttack-Genius.txt +0 -0
  14. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/utils/__init__.py +0 -0
  15. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/utils/ass.py +0 -0
  16. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/utils/cli.py +0 -0
  17. {lyrics_transcriber-0.16.2 → lyrics_transcriber-0.16.4}/lyrics_transcriber/utils/subtitles.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lyrics-transcriber
3
- Version: 0.16.2
3
+ Version: 0.16.4
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
  Home-page: https://github.com/karaokenerds/python-lyrics-transcriber
6
6
  License: MIT
@@ -26,6 +26,7 @@ Requires-Dist: openai (>=1,<2)
26
26
  Requires-Dist: openai-whisper (>=20231117)
27
27
  Requires-Dist: python-slugify (>=8)
28
28
  Requires-Dist: syrics (>=0)
29
+ Requires-Dist: tenacity (>=8)
29
30
  Requires-Dist: torch (>=1)
30
31
  Requires-Dist: tqdm (>=4)
31
32
  Requires-Dist: transformers (>=4)
@@ -14,6 +14,8 @@ from datetime import timedelta
14
14
  from .utils import subtitles
15
15
  from typing import List, Optional
16
16
  from openai import OpenAI
17
+ from tenacity import retry, stop_after_delay, wait_exponential, retry_if_exception_type
18
+ import requests
17
19
 
18
20
 
19
21
  class LyricsTranscriber:
@@ -536,6 +538,16 @@ class LyricsTranscriber:
536
538
  self.outputs["spotify_lyrics_text"] += line["words"].strip() + "\n"
537
539
  f.write(line["words"].strip() + "\n")
538
540
 
541
+ @retry(
542
+ stop=stop_after_delay(120), # Stop after 2 minutes
543
+ wait=wait_exponential(multiplier=1, min=4, max=60), # Exponential backoff starting at 4 seconds
544
+ retry=retry_if_exception_type(requests.exceptions.RequestException), # Retry on request exceptions
545
+ reraise=True, # Reraise the last exception if all retries fail
546
+ )
547
+ def fetch_genius_lyrics(self, genius, title, artist):
548
+ self.logger.debug(f"fetch_genius_lyrics attempting to fetch lyrics from Genius for {title} by {artist}")
549
+ return genius.search_song(title, artist)
550
+
539
551
  def write_genius_lyrics_file(self):
540
552
  if self.genius_api_token and self.song_known:
541
553
  self.logger.debug(f"attempting genius fetch as genius_api_token and song name was set")
@@ -556,18 +568,22 @@ class LyricsTranscriber:
556
568
  self.logger.debug(f"no cached lyrics found at genius_lyrics_cache_filepath: {genius_lyrics_cache_filepath}, fetching from Genius")
557
569
  genius = lyricsgenius.Genius(self.genius_api_token, verbose=(self.log_level == logging.DEBUG))
558
570
 
559
- song = genius.search_song(self.title, self.artist)
560
- if song is None:
561
- self.logger.warning(f'Could not find lyrics on Genius for "{self.title}" by {self.artist}')
562
- return
563
- lyrics = self.clean_genius_lyrics(song.lyrics)
571
+ try:
572
+ song = self.fetch_genius_lyrics(genius, self.title, self.artist)
573
+ if song is None:
574
+ self.logger.warning(f'Could not find lyrics on Genius for "{self.title}" by {self.artist}')
575
+ return
576
+ lyrics = self.clean_genius_lyrics(song.lyrics)
564
577
 
565
- self.logger.debug(f"writing clean lyrics to genius_lyrics_cache_filepath: {genius_lyrics_cache_filepath}")
566
- with open(genius_lyrics_cache_filepath, "w", encoding="utf-8") as f:
567
- f.write(lyrics)
578
+ self.logger.debug(f"writing clean lyrics to genius_lyrics_cache_filepath: {genius_lyrics_cache_filepath}")
579
+ with open(genius_lyrics_cache_filepath, "w", encoding="utf-8") as f:
580
+ f.write(lyrics)
568
581
 
569
- self.outputs["genius_lyrics_filepath"] = genius_lyrics_cache_filepath
570
- self.outputs["genius_lyrics_text"] = lyrics
582
+ self.outputs["genius_lyrics_filepath"] = genius_lyrics_cache_filepath
583
+ self.outputs["genius_lyrics_text"] = lyrics
584
+ except requests.exceptions.RequestException as e:
585
+ self.logger.error(f"Failed to fetch lyrics from Genius after multiple retries: {e}")
586
+ raise
571
587
 
572
588
  def clean_genius_lyrics(self, lyrics):
573
589
  lyrics = lyrics.replace("\\n", "\n")
@@ -762,9 +778,6 @@ class LyricsTranscriber:
762
778
  if "h264_videotoolbox" in ffmpeg_codes:
763
779
  video_codec = "h264_videotoolbox"
764
780
  self.logger.info(f"video codec set to hardware accelerated h264_videotoolbox")
765
- elif "h264_qsv" in ffmpeg_codes:
766
- video_codec = "h264_qsv"
767
- self.logger.info(f"video codec set to hardware accelerated h264_qsv")
768
781
 
769
782
  ffmpeg_cmd += [
770
783
  # Use accompaniment track as audio
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "lyrics-transcriber"
3
- version = "0.16.2"
3
+ version = "0.16.4"
4
4
  description = "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
  authors = ["Andrew Beveridge <andrew@beveridge.uk>"]
6
6
  license = "MIT"
@@ -30,6 +30,7 @@ openai-whisper = ">=20231117"
30
30
  transformers = ">=4"
31
31
  auditok = ">=0.2"
32
32
  whisper-timestamped = ">=1"
33
+ tenacity = ">=8"
33
34
  # Note: after adding openai-whisper and whisper-timestamped with poetry lock, I then removed all traces of triton
34
35
  # from poetry.lock before running poetry install, as triton doesn't support macOS but isn't actually needed for whisper.
35
36
  # This was the only way I was able to get a working cross-platform build published to PyPI.
@@ -47,4 +48,4 @@ lyrics-transcriber = 'lyrics_transcriber.utils.cli:main'
47
48
 
48
49
  [build-system]
49
50
  requires = ["poetry-core"]
50
- build-backend = "poetry.core.masonry.api"
51
+ build-backend = "poetry.core.masonry.api"