import time from pathlib import Path from typing import List, Optional, Tuple, Callable import numpy as np from .audio_io import save_audio_file, play_audio from .audio_queue import AudioGenerationQueue def generate_and_play_sentences( sentences: List[str], generator, speed: float = 1.0, play_function: Callable = play_audio, check_interrupt: Optional[Callable] = None, output_dir: Optional[Path] = None, sample_rate: Optional[int] = None, ) -> Tuple[bool, Optional[np.ndarray], List[Path]]: """ Generates and plays audio for each sentence with optional interruption checking. Args: sentences (List[str]): A list of sentences to generate audio for. generator: The audio generator object. speed (float, optional): The speed of audio generation. Defaults to 1.0. play_function (Callable, optional): The function to use for playing audio. Defaults to play_audio. check_interrupt (Callable, optional): An optional function to check for interruptions. Defaults to None. output_dir (Path, optional): The directory to save generated audio files. Defaults to None. sample_rate (int, optional): The sample rate of the audio. Defaults to None. Returns: Tuple[bool, Optional[np.ndarray], List[Path]]: A tuple containing: - A boolean indicating if the process was interrupted. - Optional audio data if the process was interrupted. - A list of paths to the generated audio files. """ audio_queue = AudioGenerationQueue(generator, speed, output_dir) audio_queue.start() audio_queue.add_sentences(sentences) audio_files = [] was_interrupted = False interrupt_audio = None try: while True: if check_interrupt: interrupted, audio_data = check_interrupt() if interrupted: was_interrupted = True interrupt_audio = audio_data break audio_data, output_path = audio_queue.get_next_audio() if audio_data is not None: if output_path: audio_files.append(output_path) if play_function: try: was_interrupted, interrupt_data = ( play_function(audio_data, sample_rate) if sample_rate else play_function(audio_data) ) if was_interrupted: interrupt_audio = interrupt_data break except Exception as e: print(f"Error playing audio: {str(e)}") continue if audio_queue.sentence_queue.empty() and audio_queue.audio_queue.empty(): break time.sleep(0.01) except Exception as e: print(f"Error in generate_and_play_sentences: {str(e)}") finally: audio_queue.stop() return was_interrupted, interrupt_audio, audio_files