From ce05103dd11f7efc432753d2fc0abdc20caaccd9 Mon Sep 17 00:00:00 2001 From: Claudio Santini Date: Wed, 19 Feb 2025 14:56:09 +0100 Subject: [PATCH] fix espeak --- audiblez/core.py | 21 +++++++++++++++++++++ poetry.lock | 14 +++++++------- test/test_find_chapters.py | 9 ++++----- test/test_main.py | 4 ++++ 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/audiblez/core.py b/audiblez/core.py index 1e8f22a..12924d1 100755 --- a/audiblez/core.py +++ b/audiblez/core.py @@ -3,6 +3,9 @@ # audiblez - A program to convert e-books into audiobooks using # Kokoro-82M model for high-quality text-to-speech synthesis. # by Claudio Santini 2025 - https://claudio.uk +import os +from glob import glob + import torch.cuda import spacy import ebooklib @@ -34,6 +37,23 @@ def load_spacy(): spacy.cli.download("xx_ent_wiki_sm") +def set_espeak_library(): + """Find the espeak library path""" + if os.environ.get('ESPEAK_LIBRARY'): + library = os.environ['ESPEAK_LIBRARY'] + elif platform.system() == 'Darwin': + library = glob('/opt/homebrew/Cellar/espeak-ng/*/lib/*.dylib')[0] + elif platform.system() == 'Linux': + library = glob('/usr/lib/*/libespeak-ng*')[0] + elif platform.system() == 'Windows': + library = 'C:\\Program Files*\\eSpeak NG\\libespeak-ng.dll' + else: + print('Unsupported OS, please set the espeak library path manually') + return + from phonemizer.backend.espeak.wrapper import EspeakWrapper + EspeakWrapper.set_library(library) + + def main(file_path, voice, pick_manually, speed, output_folder='.', max_chapters=None, max_sentences=None, selected_chapters=None, post_event=None): if post_event: post_event('CORE_STARTED') @@ -100,6 +120,7 @@ def main(file_path, voice, pick_manually, speed, output_folder='.', # add intro text text = f'{title} – {creator}.\n\n' + text start_time = time.time() + set_espeak_library() pipeline = KPipeline(lang_code=voice[0]) # a for american or b for british etc. if post_event: post_event('CORE_CHAPTER_STARTED', chapter_index=chapter.chapter_index) audio_segments = gen_audio_segments( diff --git a/poetry.lock b/poetry.lock index cac5f6e..d18dd93 100644 --- a/poetry.lock +++ b/poetry.lock @@ -914,20 +914,20 @@ referencing = ">=0.31.0" [[package]] name = "kokoro" -version = "0.7.9" +version = "0.7.16" description = "TTS" optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "kokoro-0.7.9-py3-none-any.whl", hash = "sha256:de2f4826daaca48da3b9d63d232e47db35047548029d0aae30c40aee3af90b5d"}, - {file = "kokoro-0.7.9.tar.gz", hash = "sha256:62b32422b8985303d7c0e30a2465945ac896a1070d01e4cd5bd8f95f9bd4c73f"}, + {file = "kokoro-0.7.16-py3-none-any.whl", hash = "sha256:27d8e8cfd6ec4fdad5caacb5e3fabd7b2576b778226c8cd0f92e1c33ff14f553"}, + {file = "kokoro-0.7.16.tar.gz", hash = "sha256:c1cf957cfff76cbb6702f16a3cd15eea2a30c561f2c3b6b42107e39e6456316e"}, ] [package.dependencies] huggingface-hub = "*" loguru = "*" -misaki = {version = ">=0.7.9", extras = ["en"]} +misaki = {version = ">=0.7.16", extras = ["en"]} numpy = "1.26.4" scipy = "*" torch = "*" @@ -1341,14 +1341,14 @@ files = [ [[package]] name = "misaki" -version = "0.7.12" +version = "0.7.17" description = "G2P engine for TTS" optional = false python-versions = "<3.13,>=3.8" groups = ["main"] files = [ - {file = "misaki-0.7.12-py3-none-any.whl", hash = "sha256:bb71a0e85ff70557d96303560ac72ccf669a02fb126b3e0b38eed3215bb80b34"}, - {file = "misaki-0.7.12.tar.gz", hash = "sha256:cfe714488012ab6beaad08077ce782559f9f0e019989df8bfa3ebc7674f7c33f"}, + {file = "misaki-0.7.17-py3-none-any.whl", hash = "sha256:5c739a540e715c368f9dbcf3e99f814575853785d5ba0096956acabcf58be0cd"}, + {file = "misaki-0.7.17.tar.gz", hash = "sha256:301ea5ee3bd6dfcf5539bbd55c928a1855cf1bf6a90a367362072348a0e4a16a"}, ] [package.dependencies] diff --git a/test/test_find_chapters.py b/test/test_find_chapters.py index 8cbf554..84edc90 100644 --- a/test/test_find_chapters.py +++ b/test/test_find_chapters.py @@ -1,10 +1,9 @@ import unittest from ebooklib import epub -from audiblez import find_good_chapters, find_document_chapters_and_extract_texts +from audiblez.core import find_document_chapters_and_extract_texts, find_good_chapters -@unittest.skip('Development only, not for CI') class FindChaptersTest(unittest.TestCase): def base(self, file, expected_chapter_names): book = epub.read_epub(file) @@ -46,7 +45,7 @@ class FindChaptersTest(unittest.TestCase): ]) def test_spawn_of_dagon(self): - self.base('../epub/kuttner-spawn-of-dagon.epub', [ + self.base('../epub/dagon.epub', [ # 'bk01-toc.xhtml', # 276 # 'cover.xhtml', # 76 # 'index.xhtml', # 1399 @@ -62,7 +61,7 @@ class FindChaptersTest(unittest.TestCase): ]) def test_lewis_innocents(self): - self.base('../epub/lewis-innocents.epub', [ + self.base('../epub/lewis.epub', [ # 'bk01-toc.xhtml', # 1603 # 'cover.xhtml', # 72 # 'index.xhtml', # 1554 @@ -178,5 +177,5 @@ class FindChaptersTest(unittest.TestCase): '2903486949112998543_345-h-30.htm.xhtml', # 4081 '2903486949112998543_345-h-31.htm.xhtml', # 19692 'toc.xhtml', # 4900 - 'wrap0000.xhtml', # 374 + # 'wrap0000.xhtml', # 374 ]) diff --git a/test/test_main.py b/test/test_main.py index e141a2e..634eba1 100644 --- a/test/test_main.py +++ b/test/test_main.py @@ -7,6 +7,10 @@ from ebooklib import epub from audiblez.core import main, find_document_chapters_and_extract_texts +# from phonemizer.backend.espeak.wrapper import EspeakWrapper + +# EspeakWrapper.set_library('/opt/homebrew/Cellar/espeak-ng/1.52.0/lib/libespeak-ng.1.dylib') + class MainTest(unittest.TestCase): def base(self, name, url='', **kwargs):