|
import torch |
|
from datetime import datetime |
|
from pathlib import Path |
|
from .voice import quick_mix_voice |
|
|
|
|
|
def handle_commands(user_input, generator, speed, model_path=None): |
|
""" |
|
Handles bot commands to control the voice generator. |
|
|
|
Args: |
|
user_input (str): The command input from the user. |
|
generator: The voice generator object. |
|
speed (float): The current speed of the generator. |
|
model_path (str, optional): The path to the model. Defaults to None. |
|
|
|
Returns: |
|
bool: True if a command was handled, False otherwise. |
|
""" |
|
if user_input.lower() == "quit": |
|
print("Goodbye!") |
|
return True |
|
|
|
if user_input.lower() == "voices": |
|
voices = generator.list_available_voices() |
|
print("\nAvailable voices:") |
|
for voice in voices: |
|
print(f"- {voice}") |
|
return True |
|
|
|
if user_input.startswith("speed="): |
|
try: |
|
new_speed = float(user_input.split("=")[1]) |
|
print(f"Speed set to {new_speed}") |
|
return True |
|
except: |
|
print("Invalid speed value. Use format: speed=1.2") |
|
return True |
|
|
|
if user_input.startswith("voice="): |
|
try: |
|
voice = user_input.split("=")[1] |
|
if voice in generator.list_available_voices(): |
|
generator.initialize(model_path or generator.model_path, voice) |
|
print(f"Switched to voice: {voice}") |
|
else: |
|
print("Voice not found. Use 'voices' to list available voices.") |
|
except Exception as e: |
|
print(f"Error changing voice: {str(e)}") |
|
return True |
|
|
|
if user_input.startswith("mix="): |
|
try: |
|
mix_input = user_input.split("=")[1] |
|
voices_weights = mix_input.split(":") |
|
voices = [v.strip() for v in voices_weights[0].split(",")] |
|
|
|
if len(voices_weights) > 1: |
|
weights = [float(w.strip()) for w in voices_weights[1].split(",")] |
|
else: |
|
weights = [0.5, 0.5] |
|
|
|
if len(voices) != 2 or len(weights) != 2: |
|
print( |
|
"Mix command requires exactly two voices. Format: mix=voice1,voice2[:weight1,weight2]" |
|
) |
|
return True |
|
|
|
available_voices = generator.list_available_voices() |
|
if not all(voice in available_voices for voice in voices): |
|
print( |
|
"One or more voices not found. Use 'voices' to list available voices." |
|
) |
|
return True |
|
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") |
|
output_name = f"af_mixed_voice_{timestamp}" |
|
|
|
voice_tensors = [] |
|
for voice_name in voices: |
|
voice_path = Path(generator.voices_dir) / f"{voice_name}.pt" |
|
voice = torch.load(voice_path, weights_only=True) |
|
voice_tensors.append(voice) |
|
|
|
mixed = quick_mix_voice( |
|
output_name, generator.voices_dir, *voice_tensors, weights=weights |
|
) |
|
|
|
generator.initialize(model_path or generator.model_path, output_name) |
|
print( |
|
f"Mixed voices: {voices[0]} ({weights[0]:.1f}) and {voices[1]} ({weights[1]:.1f})" |
|
) |
|
except Exception as e: |
|
print(f"Error mixing voices: {str(e)}") |
|
return True |
|
|
|
return False |
|
|