Abdullah Al Asif
--base
78cb487
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