ai-audio-books / src /builder.py
bl4dylion's picture
add text_mod and audio normalization
3ee8f12
raw
history blame
1.97 kB
from langchain_community.callbacks import get_openai_callback
from src.audio_generators import AudioGeneratorSimple, AudioGeneratorWithEffects
from src.lc_callbacks import LCMessageLoggerAsync
from src.select_voice_chain import SelectVoiceChainOutput, VoiceSelector
from src.text_split_chain import SplitTextOutput, create_split_text_chain
from src.utils import GPTModels
class AudiobookBuilder:
def __init__(self):
self.voice_selector = VoiceSelector(
csv_table_fp="data/11labs_available_tts_voices.csv"
)
self.audio_generator = AudioGeneratorWithEffects()
async def split_text(self, text: str) -> SplitTextOutput:
chain = create_split_text_chain(llm_model=GPTModels.GPT_4o)
with get_openai_callback() as cb:
chain_out = await chain.ainvoke(
{"text": text}, config={"callbacks": [LCMessageLoggerAsync()]}
)
return chain_out
async def map_characters_to_voices(
self, text_split: SplitTextOutput
) -> SelectVoiceChainOutput:
chain = self.voice_selector.create_voice_mapping_chain(
llm_model=GPTModels.GPT_4o
)
with get_openai_callback() as cb:
chain_out = await chain.ainvoke(
{
"text": text_split.text_annotated,
"characters": text_split.characters,
},
config={"callbacks": [LCMessageLoggerAsync()]},
)
return chain_out
async def run(self, text: str):
text_split = await self.split_text(text)
select_voice_chain_out = await self.map_characters_to_voices(
text_split=text_split
)
# TODO: show select_voice_chain_out.character2props on UI
out_path = await self.audio_generator.generate_audio(
text_split=text_split,
character_to_voice=select_voice_chain_out.character2voice,
)
return out_path