Ktk / scripts /cli.py
NeuralFalcon's picture
Create cli.py
c920f65 verified
raw
history blame
4.16 kB
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()