gradio_url="http://127.0.0.1:7860/" from gradio_client import Client import json import os import shutil from rich.console import Console from rich.text import Text import simpleaudio as sa # Initialize the Gradio client client = Client(gradio_url) console = Console() voice_dict = None voices = {} output_dir = "api_output" def get_voice_names(): global voice_dict # Get the result from the client result = client.predict(api_name="/get_voice_names") # Convert the result string into a Python dictionary voice_dict = json.loads(result) id = 1 for key in voice_dict: if len(voice_dict[key]) > 0: for i in voice_dict[key]: voices[id] = i id += 1 return voice_dict def display_voice_names(): global voice_dict id_num = 1 for key in voice_dict: if len(voice_dict[key]) > 0: gender = key.replace("_", " ").capitalize() console.print(f"[bold cyan]{gender}:[/bold cyan]") for voice in voice_dict[key]: console.print(f"[green]{id_num}. {voice}[/green]") id_num += 1 # console.print() def text_to_speech( text="Hello!!", model_name="kokoro-v0_19.pth", voice_name="af_bella", speed=1, pad_between_segments=0, remove_silence=False, minimum_silence=0.05, custom_voicepack=None, ): # Call the API with provided parameters result = client.predict( text=text, model_name=model_name, voice_name=voice_name, speed=speed, pad_between_segments=pad_between_segments, remove_silence=remove_silence, minimum_silence=minimum_silence, custom_voicepack=custom_voicepack, api_name="/text_to_speech" ) # Save the audio file in the specified directory save_at = f"{output_dir}/{os.path.basename(result)}" shutil.move(result, save_at) return save_at def choose_voice(): while True: display_voice_names() user_input = console.input("[bold yellow]Choose a voice ID number or type 'exit' to quit: [/bold yellow]") try: voice_number = int(user_input) if voice_number in voices: selected_voice = voices[voice_number] console.print(f"[bold green]You selected: {selected_voice}[/bold green]\n") return selected_voice else: console.print("[bold red]Invalid number. Please choose a valid voice number.[/bold red]") except ValueError: if user_input.lower() == "exit": console.print("[bold red]Exiting voice selection.[/bold red]") return None else: console.print("[bold red]Invalid input. Please enter a valid number or 'exit'.[/bold red]") def play_audio(filename): wave_obj = sa.WaveObject.from_wave_file(filename) play_obj = wave_obj.play() play_obj.wait_done() # Ensure the output directory exists os.makedirs(output_dir, exist_ok=True) voice_dict = get_voice_names() def text_to_speech_cli(): while True: voice_name = choose_voice() if not voice_name: break # print( # "Type 'C' to change voice or 'q' to quit" # ) while True: text = console.input( "[bold green]Enter Text ('C' to change voice, 'q' for quit): [/bold green]" ) if text.lower() == "q": console.print("[bold red]Exiting text-to-speech CLI.[/bold red]") return elif text.lower() == "c": console.print("[bold yellow]Changing voice...[/bold yellow]") break # Break the inner loop to select a new voice else: audio_path = text_to_speech(text=text, voice_name=voice_name) play_audio(audio_path) # console.print("[bold green]Audio played successfully![/bold green]\n") if __name__ == "__main__": console.print("[bold blue]Welcome to the Text-to-Speech CLI![/bold blue]\n") text_to_speech_cli()