mirror of
https://github.com/jamiepine/voicebox.git
synced 2026-09-15 21:00:42 -07:00
- Added support for TTS providers in the backend, including endpoints for listing, starting, stopping, and downloading providers. - Enhanced the release workflow to build and upload TTS provider binaries for both Windows and Linux platforms. - Updated the architecture documentation to reflect the new provider system and its benefits for modularity and user experience. - Introduced a new `ProviderSettings` component in the frontend for managing provider configurations.
63 lines
1.7 KiB
Python
63 lines
1.7 KiB
Python
"""
|
|
TTS inference module - delegates to provider abstraction layer.
|
|
"""
|
|
|
|
from typing import Optional
|
|
import numpy as np
|
|
import io
|
|
import soundfile as sf
|
|
|
|
from .backends import TTSBackend
|
|
from .providers import get_provider_manager
|
|
from .providers.base import TTSProvider
|
|
|
|
|
|
def get_tts_model() -> TTSProvider:
|
|
"""
|
|
Get TTS provider instance (via ProviderManager).
|
|
|
|
Returns:
|
|
TTS provider instance
|
|
"""
|
|
manager = get_provider_manager()
|
|
# Note: This is async but we need sync interface for backward compatibility
|
|
# In practice, this will be called from async contexts
|
|
import asyncio
|
|
try:
|
|
loop = asyncio.get_event_loop()
|
|
if loop.is_running():
|
|
# We're in an async context, but can't await here
|
|
# Return a wrapper that will use the provider manager
|
|
return manager._get_default_provider()
|
|
else:
|
|
return loop.run_until_complete(manager.get_active_provider())
|
|
except RuntimeError:
|
|
# No event loop, return default
|
|
return manager._get_default_provider()
|
|
|
|
|
|
async def get_tts_model_async() -> TTSProvider:
|
|
"""
|
|
Get TTS provider instance asynchronously.
|
|
|
|
Returns:
|
|
TTS provider instance
|
|
"""
|
|
manager = get_provider_manager()
|
|
return await manager.get_active_provider()
|
|
|
|
|
|
def unload_tts_model():
|
|
"""Unload TTS model to free memory."""
|
|
manager = get_provider_manager()
|
|
provider = manager._get_default_provider()
|
|
provider.unload_model()
|
|
|
|
|
|
def audio_to_wav_bytes(audio: np.ndarray, sample_rate: int) -> bytes:
|
|
"""Convert audio array to WAV bytes."""
|
|
buffer = io.BytesIO()
|
|
sf.write(buffer, audio, sample_rate, format="WAV")
|
|
buffer.seek(0)
|
|
return buffer.read()
|