From 130b084cceb593abc3225abd02602121d7f003e8 Mon Sep 17 00:00:00 2001 From: remsky Date: Tue, 7 Jan 2025 03:50:08 -0700 Subject: [PATCH] - Added support for combining voices via any endpoint - Updated the `process_voices` function to handle both string and list formats for voice input. --- Kokoro-82M | 2 +- README.md | 17 +-- api/src/routers/openai_compatible.py | 62 +++++--- api/src/services/tts_service.py | 10 +- api/src/structures/schemas.py | 10 +- api/tests/test_endpoints.py | 204 +++++++++++++++++++++------ api/tests/test_tts_service.py | 55 +++++--- examples/openai_streaming_audio.py | 2 +- examples/speech.mp3 | Bin 0 -> 80640 bytes requirements.txt | 1 + 10 files changed, 259 insertions(+), 104 deletions(-) create mode 100644 examples/speech.mp3 diff --git a/Kokoro-82M b/Kokoro-82M index c97b7bb..3095858 160000 --- a/Kokoro-82M +++ b/Kokoro-82M @@ -1 +1 @@ -Subproject commit c97b7bbc3e60f447383c79b2f94fee861ff156ac +Subproject commit 3095858c40fc22e28c46429da9340dfda1f8cf28 diff --git a/README.md b/README.md index 17040b9..b26fe6d 100644 --- a/README.md +++ b/README.md @@ -3,17 +3,17 @@

# Kokoro TTS API -[![Tests](https://img.shields.io/badge/tests-98%20passed-darkgreen)]() -[![Coverage](https://img.shields.io/badge/coverage-73%25-darkgreen)]() +[![Tests](https://img.shields.io/badge/tests-105%20passed-darkgreen)]() +[![Coverage](https://img.shields.io/badge/coverage-74%25-darkgreen)]() [![Tested at Model Commit](https://img.shields.io/badge/last--tested--model--commit-a67f113-blue)](https://huggingface.co/hexgrad/Kokoro-82M/tree/c3b0d86e2a980e027ef71c28819ea02e351c2667) [![Try on Spaces](https://img.shields.io/badge/%F0%9F%A4%97%20Try%20on-Spaces-blue)](https://huggingface.co/spaces/Remsky/Kokoro-TTS-Zero) Dockerized FastAPI wrapper for [Kokoro-82M](https://huggingface.co/hexgrad/Kokoro-82M) text-to-speech model -- OpenAI-compatible Speech endpoint, with voice combination functionality +- OpenAI-compatible Speech endpoint, with inline voice combination functionality - NVIDIA GPU accelerated inference (or CPU) option - very fast generation time - ~ 35x real time speed via 4060Ti, ~300ms latency - ~ 6x real time spead via M3 Pro CPU, ~1000ms latency -- streaming support w/ variable chunking control latency & artifacts +- streaming support w/ variable chunking to control latency & artifacts - simple audio generation web ui utility @@ -39,7 +39,7 @@ The service can be accessed through either the API endpoints or the Gradio web i response = client.audio.speech.create( model="kokoro", - voice="af_bella", + voice="af_sky+af_bella", #single or multiple voicepack combo input="Hello world!", response_format="mp3" ) @@ -61,7 +61,7 @@ from openai import OpenAI client = OpenAI(base_url="http://localhost:8880", api_key="not-needed") response = client.audio.speech.create( model="kokoro", # Not used but required for compatibility, also accepts library defaults - voice="af_bella", + voice="af_bella+af_sky", input="Hello world!", response_format="mp3" ) @@ -105,6 +105,7 @@ python examples/test_all_voices.py # Test all available voices - Averages model weights of any existing voicepacks - Saves generated voicepacks for future use +- (new) Available through any endpoint, simply concatenate desired packs with "+" Combine voices and generate audio: ```python @@ -119,12 +120,12 @@ response = requests.post( ) combined_voice = response.json()["voice"] -# Generate audio with combined voice +# Generate audio with combined voice (or, simply pass multiple directly with `+` ) response = requests.post( "http://localhost:8880/v1/audio/speech", json={ "input": "Hello world!", - "voice": combined_voice, + "voice": combined_voice, # or skip the above step with f"{voices[0]}+{voices[1]}" "response_format": "mp3" } ) diff --git a/api/src/routers/openai_compatible.py b/api/src/routers/openai_compatible.py index 2b30c7a..b790b4b 100644 --- a/api/src/routers/openai_compatible.py +++ b/api/src/routers/openai_compatible.py @@ -1,4 +1,4 @@ -from typing import List +from typing import List, Union from loguru import logger from fastapi import Depends, Response, APIRouter, HTTPException @@ -20,18 +20,43 @@ def get_tts_service() -> TTSService: return TTSService() # Initialize TTSService with default settings +async def process_voices(voice_input: Union[str, List[str]], tts_service: TTSService) -> str: + """Process voice input into a combined voice, handling both string and list formats""" + # Convert input to list of voices + if isinstance(voice_input, str): + voices = [v.strip() for v in voice_input.split("+") if v.strip()] + else: + voices = voice_input + + if not voices: + raise ValueError("No voices provided") + + # Check if all voices exist + available_voices = await tts_service.list_voices() + for voice in voices: + if voice not in available_voices: + raise ValueError(f"Voice '{voice}' not found. Available voices: {', '.join(sorted(available_voices))}") + + # If single voice, return it directly + if len(voices) == 1: + return voices[0] + + # Otherwise combine voices + return await tts_service.combine_voices(voices=voices) + + async def stream_audio_chunks(tts_service: TTSService, request: OpenAISpeechRequest) -> AsyncGenerator[bytes, None]: """Stream audio chunks as they're generated""" + voice_to_use = await process_voices(request.voice, tts_service) async for chunk in tts_service.generate_audio_stream( text=request.input, - voice=request.voice, + voice=voice_to_use, speed=request.speed, output_format=request.response_format ): yield chunk - @router.post("/audio/speech") async def create_speech( request: OpenAISpeechRequest, @@ -40,12 +65,8 @@ async def create_speech( ): """OpenAI-compatible endpoint for text-to-speech""" try: - # Validate voice exists - available_voices = tts_service.list_voices() - if request.voice not in available_voices: - raise ValueError( - f"Voice '{request.voice}' not found. Available voices: {', '.join(sorted(available_voices))}" - ) + # Process voice combination and validate + voice_to_use = await process_voices(request.voice, tts_service) # Set content type based on format content_type = { @@ -73,7 +94,7 @@ async def create_speech( # Generate complete audio audio, _ = tts_service._generate_audio( text=request.input, - voice=request.voice, + voice=voice_to_use, speed=request.speed, stitch_long_output=True, ) @@ -111,7 +132,7 @@ async def create_speech( async def list_voices(tts_service: TTSService = Depends(get_tts_service)): """List all available voices for text-to-speech""" try: - voices = tts_service.list_voices() + voices = await tts_service.list_voices() return {"voices": voices} except Exception as e: logger.error(f"Error listing voices: {str(e)}") @@ -120,12 +141,13 @@ async def list_voices(tts_service: TTSService = Depends(get_tts_service)): @router.post("/audio/voices/combine") async def combine_voices( - request: List[str], tts_service: TTSService = Depends(get_tts_service) + request: Union[str, List[str]], tts_service: TTSService = Depends(get_tts_service) ): """Combine multiple voices into a new voice. Args: - request: List of voice names to combine + request: Either a string with voices separated by + (e.g. "voice1+voice2") + or a list of voice names to combine Returns: Dict with combined voice name and list of all available voices @@ -136,8 +158,8 @@ async def combine_voices( - 500: Server error (file system issues, combination failed) """ try: - combined_voice = tts_service.combine_voices(voices=request) - voices = tts_service.list_voices() + combined_voice = await process_voices(request, tts_service) + voices = await tts_service.list_voices() return {"voices": voices, "voice": combined_voice} except ValueError as e: @@ -146,14 +168,8 @@ async def combine_voices( status_code=400, detail={"error": "Invalid request", "message": str(e)} ) - except RuntimeError as e: + except Exception as e: logger.error(f"Server error during voice combination: {str(e)}") raise HTTPException( - status_code=500, detail={"error": "Server error", "message": str(e)} - ) - - except Exception as e: - logger.error(f"Unexpected error during voice combination: {str(e)}") - raise HTTPException( - status_code=500, detail={"error": "Unexpected error", "message": str(e)} + status_code=500, detail={"error": "Server error", "message": "Server error"} ) diff --git a/api/src/services/tts_service.py b/api/src/services/tts_service.py index 8e2aed6..cd3da2e 100644 --- a/api/src/services/tts_service.py +++ b/api/src/services/tts_service.py @@ -1,9 +1,11 @@ +import aiofiles import io import os import re import time from typing import List, Tuple, Optional from functools import lru_cache +from aiofiles import threadpool import numpy as np import torch @@ -211,7 +213,7 @@ class TTSService: wavfile.write(buffer, 24000, audio) return buffer.getvalue() - def combine_voices(self, voices: List[str]) -> str: + async def combine_voices(self, voices: List[str]) -> str: """Combine multiple voices into a new voice""" if len(voices) < 2: raise ValueError("At least 2 voices are required for combination") @@ -252,11 +254,13 @@ class TTSService: raise RuntimeError(f"Error combining voices: {str(e)}") raise - def list_voices(self) -> List[str]: + async def list_voices(self) -> List[str]: """List all available voices""" voices = [] try: - for file in os.listdir(TTSModel.VOICES_DIR): + # Use os.listdir in a thread pool + files = await threadpool.async_wrap(os.listdir)(TTSModel.VOICES_DIR) + for file in files: if file.endswith(".pt"): voices.append(file[:-3]) # Remove .pt extension except Exception as e: diff --git a/api/src/structures/schemas.py b/api/src/structures/schemas.py index 66db7ad..48bc099 100644 --- a/api/src/structures/schemas.py +++ b/api/src/structures/schemas.py @@ -1,9 +1,17 @@ from enum import Enum -from typing import Literal +from typing import Literal, Union, List from pydantic import Field, BaseModel +class VoiceCombineRequest(BaseModel): + """Request schema for voice combination endpoint that accepts either a string with + or a list""" + voices: Union[str, List[str]] = Field( + ..., + description="Either a string with voices separated by + (e.g. 'voice1+voice2') or a list of voice names to combine" + ) + + class TTSStatus(str, Enum): PENDING = "pending" PROCESSING = "processing" diff --git a/api/tests/test_endpoints.py b/api/tests/test_endpoints.py index 4827adc..bd9e578 100644 --- a/api/tests/test_endpoints.py +++ b/api/tests/test_endpoints.py @@ -29,7 +29,9 @@ def mock_tts_service(monkeypatch): for chunk in [b"chunk1", b"chunk2"]: yield chunk mock_service.generate_audio_stream = mock_stream - mock_service.list_voices.return_value = [ + + # Create async mocks + mock_service.list_voices = AsyncMock(return_value=[ "af", "bm_lewis", "bf_isabella", @@ -39,7 +41,8 @@ def mock_tts_service(monkeypatch): "am_adam", "am_michael", "bm_george", - ] + ]) + mock_service.combine_voices = AsyncMock() monkeypatch.setattr( "api.src.routers.openai_compatible.TTSService", lambda *args, **kwargs: mock_service, @@ -64,7 +67,8 @@ def test_health_check(): assert response.json() == {"status": "healthy"} -def test_openai_speech_endpoint(mock_tts_service, mock_audio_service): +@pytest.mark.asyncio +async def test_openai_speech_endpoint(mock_tts_service, mock_audio_service, async_client): """Test the OpenAI-compatible speech endpoint""" test_request = { "model": "kokoro", @@ -74,7 +78,7 @@ def test_openai_speech_endpoint(mock_tts_service, mock_audio_service): "speed": 1.0, "stream": False # Explicitly disable streaming } - response = client.post("/v1/audio/speech", json=test_request) + response = await async_client.post("/v1/audio/speech", json=test_request) assert response.status_code == 200 assert response.headers["content-type"] == "audio/wav" assert response.headers["content-disposition"] == "attachment; filename=speech.wav" @@ -84,7 +88,8 @@ def test_openai_speech_endpoint(mock_tts_service, mock_audio_service): assert response.content == b"converted mock audio data" -def test_openai_speech_invalid_voice(mock_tts_service): +@pytest.mark.asyncio +async def test_openai_speech_invalid_voice(mock_tts_service, async_client): """Test the OpenAI-compatible speech endpoint with invalid voice""" test_request = { "model": "kokoro", @@ -94,12 +99,13 @@ def test_openai_speech_invalid_voice(mock_tts_service): "speed": 1.0, "stream": False # Explicitly disable streaming } - response = client.post("/v1/audio/speech", json=test_request) + response = await async_client.post("/v1/audio/speech", json=test_request) assert response.status_code == 400 # Bad request assert "not found" in response.json()["detail"]["message"] -def test_openai_speech_invalid_speed(mock_tts_service): +@pytest.mark.asyncio +async def test_openai_speech_invalid_speed(mock_tts_service, async_client): """Test the OpenAI-compatible speech endpoint with invalid speed""" test_request = { "model": "kokoro", @@ -109,11 +115,12 @@ def test_openai_speech_invalid_speed(mock_tts_service): "speed": -1.0, # Invalid speed "stream": False # Explicitly disable streaming } - response = client.post("/v1/audio/speech", json=test_request) + response = await async_client.post("/v1/audio/speech", json=test_request) assert response.status_code == 422 # Validation error -def test_openai_speech_generation_error(mock_tts_service): +@pytest.mark.asyncio +async def test_openai_speech_generation_error(mock_tts_service, async_client): """Test error handling in speech generation""" mock_tts_service._generate_audio.side_effect = Exception("Generation failed") test_request = { @@ -124,54 +131,173 @@ def test_openai_speech_generation_error(mock_tts_service): "speed": 1.0, "stream": False # Explicitly disable streaming } - response = client.post("/v1/audio/speech", json=test_request) + response = await async_client.post("/v1/audio/speech", json=test_request) assert response.status_code == 500 assert "Generation failed" in response.json()["detail"]["message"] -def test_combine_voices_success(mock_tts_service): - """Test successful voice combination""" +@pytest.mark.asyncio +async def test_combine_voices_list_success(mock_tts_service, async_client): + """Test successful voice combination using list format""" test_voices = ["af_bella", "af_sarah"] - mock_tts_service.combine_voices.return_value = "af_bella_af_sarah" + mock_tts_service.combine_voices = AsyncMock(return_value="af_bella_af_sarah") - response = client.post("/v1/audio/voices/combine", json=test_voices) + response = await async_client.post("/v1/audio/voices/combine", json=test_voices) assert response.status_code == 200 assert response.json()["voice"] == "af_bella_af_sarah" mock_tts_service.combine_voices.assert_called_once_with(voices=test_voices) -def test_combine_voices_single_voice(mock_tts_service): - """Test combining single voice returns default voice""" +@pytest.mark.asyncio +async def test_combine_voices_string_success(mock_tts_service, async_client): + """Test successful voice combination using string format with +""" + test_voices = "af_bella+af_sarah" + mock_tts_service.combine_voices = AsyncMock(return_value="af_bella_af_sarah") + + response = await async_client.post("/v1/audio/voices/combine", json=test_voices) + + assert response.status_code == 200 + assert response.json()["voice"] == "af_bella_af_sarah" + mock_tts_service.combine_voices.assert_called_once_with(voices=["af_bella", "af_sarah"]) + + +@pytest.mark.asyncio +async def test_combine_voices_single_voice(mock_tts_service, async_client): + """Test combining single voice returns same voice""" test_voices = ["af_bella"] - mock_tts_service.combine_voices.return_value = "af" - - response = client.post("/v1/audio/voices/combine", json=test_voices) - + response = await async_client.post("/v1/audio/voices/combine", json=test_voices) assert response.status_code == 200 - assert response.json()["voice"] == "af" + assert response.json()["voice"] == "af_bella" -def test_combine_voices_empty_list(mock_tts_service): - """Test combining empty voice list returns default voice""" +@pytest.mark.asyncio +async def test_combine_voices_empty_list(mock_tts_service, async_client): + """Test combining empty voice list returns error""" test_voices = [] - mock_tts_service.combine_voices.return_value = "af" - - response = client.post("/v1/audio/voices/combine", json=test_voices) - - assert response.status_code == 200 - assert response.json()["voice"] == "af" + response = await async_client.post("/v1/audio/voices/combine", json=test_voices) + assert response.status_code == 400 + assert "No voices provided" in response.json()["detail"]["message"] -def test_combine_voices_error(mock_tts_service): +@pytest.mark.asyncio +async def test_combine_voices_error(mock_tts_service, async_client): """Test error handling in voice combination""" test_voices = ["af_bella", "af_sarah"] - mock_tts_service.combine_voices.side_effect = Exception("Combination failed") - - response = client.post("/v1/audio/voices/combine", json=test_voices) + mock_tts_service.combine_voices = AsyncMock(side_effect=Exception("Combination failed")) + response = await async_client.post("/v1/audio/voices/combine", json=test_voices) assert response.status_code == 500 - assert "Combination failed" in response.json()["detail"]["message"] + assert "Server error" in response.json()["detail"]["message"] + + +@pytest.mark.asyncio +async def test_speech_with_combined_voice(mock_tts_service, mock_audio_service, async_client): + """Test speech generation with combined voice using + syntax""" + mock_tts_service.combine_voices = AsyncMock(return_value="af_bella_af_sarah") + + test_request = { + "model": "kokoro", + "input": "Hello world", + "voice": "af_bella+af_sarah", + "response_format": "wav", + "speed": 1.0, + "stream": False + } + + response = await async_client.post("/v1/audio/speech", json=test_request) + + assert response.status_code == 200 + assert response.headers["content-type"] == "audio/wav" + mock_tts_service._generate_audio.assert_called_once_with( + text="Hello world", + voice="af_bella_af_sarah", + speed=1.0, + stitch_long_output=True + ) + + +@pytest.mark.asyncio +async def test_speech_with_whitespace_in_voice(mock_tts_service, mock_audio_service, async_client): + """Test speech generation with whitespace in voice combination""" + mock_tts_service.combine_voices = AsyncMock(return_value="af_bella_af_sarah") + + test_request = { + "model": "kokoro", + "input": "Hello world", + "voice": " af_bella + af_sarah ", + "response_format": "wav", + "speed": 1.0, + "stream": False + } + + response = await async_client.post("/v1/audio/speech", json=test_request) + + assert response.status_code == 200 + assert response.headers["content-type"] == "audio/wav" + mock_tts_service.combine_voices.assert_called_once_with(voices=["af_bella", "af_sarah"]) + + +@pytest.mark.asyncio +async def test_speech_with_empty_voice_combination(mock_tts_service, async_client): + """Test speech generation with empty voice combination""" + test_request = { + "model": "kokoro", + "input": "Hello world", + "voice": "+", + "response_format": "wav", + "speed": 1.0, + "stream": False + } + + response = await async_client.post("/v1/audio/speech", json=test_request) + assert response.status_code == 400 + assert "No voices provided" in response.json()["detail"]["message"] + + +@pytest.mark.asyncio +async def test_speech_with_invalid_combined_voice(mock_tts_service, async_client): + """Test speech generation with invalid voice combination""" + test_request = { + "model": "kokoro", + "input": "Hello world", + "voice": "invalid+combination", + "response_format": "wav", + "speed": 1.0, + "stream": False + } + + response = await async_client.post("/v1/audio/speech", json=test_request) + assert response.status_code == 400 + assert "not found" in response.json()["detail"]["message"] + + +@pytest.mark.asyncio +async def test_speech_streaming_with_combined_voice(mock_tts_service, async_client): + """Test streaming speech with combined voice using + syntax""" + mock_tts_service.combine_voices = AsyncMock(return_value="af_bella_af_sarah") + + test_request = { + "model": "kokoro", + "input": "Hello world", + "voice": "af_bella+af_sarah", + "response_format": "mp3", + "stream": True + } + + # Create streaming mock + async def mock_stream(*args, **kwargs): + for chunk in [b"mp3header", b"mp3data"]: + yield chunk + mock_tts_service.generate_audio_stream = mock_stream + + # Add streaming header + headers = {"x-raw-response": "stream"} + response = await async_client.post("/v1/audio/speech", json=test_request, headers=headers) + + assert response.status_code == 200 + assert response.headers["content-type"] == "audio/mpeg" + assert response.headers["content-disposition"] == "attachment; filename=speech.mp3" @pytest.mark.asyncio @@ -197,9 +323,6 @@ async def test_openai_speech_pcm_streaming(mock_tts_service, async_client): assert response.status_code == 200 assert response.headers["content-type"] == "audio/pcm" - # Just verify status and content type - assert response.status_code == 200 - assert response.headers["content-type"] == "audio/pcm" @pytest.mark.asyncio @@ -226,10 +349,6 @@ async def test_openai_speech_streaming_mp3(mock_tts_service, async_client): assert response.status_code == 200 assert response.headers["content-type"] == "audio/mpeg" assert response.headers["content-disposition"] == "attachment; filename=speech.mp3" - # Just verify status and content type - assert response.status_code == 200 - assert response.headers["content-type"] == "audio/mpeg" - assert response.headers["content-disposition"] == "attachment; filename=speech.mp3" @pytest.mark.asyncio @@ -255,6 +374,3 @@ async def test_openai_speech_streaming_generator(mock_tts_service, async_client) assert response.status_code == 200 assert response.headers["content-type"] == "audio/pcm" - # Just verify status and content type - assert response.status_code == 200 - assert response.headers["content-type"] == "audio/pcm" diff --git a/api/tests/test_tts_service.py b/api/tests/test_tts_service.py index 4fa2c52..bc0eeba 100644 --- a/api/tests/test_tts_service.py +++ b/api/tests/test_tts_service.py @@ -1,12 +1,13 @@ """Tests for TTSService""" import os -from unittest.mock import MagicMock, call, patch +from unittest.mock import MagicMock, call, patch, AsyncMock import numpy as np import torch import pytest from onnxruntime import InferenceSession +from aiofiles import threadpool from api.src.core.config import settings from api.src.services.tts_model import TTSModel @@ -38,27 +39,33 @@ def test_audio_to_bytes(tts_service, sample_audio): assert len(audio_bytes) > 0 -@patch("os.listdir") -@patch("os.path.join") -def test_list_voices(mock_join, mock_listdir, tts_service): +@pytest.mark.asyncio +async def test_list_voices(tts_service): """Test listing available voices""" - mock_listdir.return_value = ["voice1.pt", "voice2.pt", "not_a_voice.txt"] - mock_join.return_value = "/fake/path" - - voices = tts_service.list_voices() - assert len(voices) == 2 - assert "voice1" in voices - assert "voice2" in voices - assert "not_a_voice" not in voices + # Mock os.listdir to return test files + with patch('os.listdir', return_value=["voice1.pt", "voice2.pt", "not_a_voice.txt"]): + # Register mock with threadpool + async_listdir = AsyncMock(return_value=["voice1.pt", "voice2.pt", "not_a_voice.txt"]) + threadpool.async_wrap = MagicMock(return_value=async_listdir) + + voices = await tts_service.list_voices() + assert len(voices) == 2 + assert "voice1" in voices + assert "voice2" in voices + assert "not_a_voice" not in voices -@patch("os.listdir") -def test_list_voices_error(mock_listdir, tts_service): +@pytest.mark.asyncio +async def test_list_voices_error(tts_service): """Test error handling in list_voices""" - mock_listdir.side_effect = Exception("Failed to list directory") - - voices = tts_service.list_voices() - assert voices == [] + # Mock os.listdir to raise an exception + with patch('os.listdir', side_effect=Exception("Failed to list directory")): + # Register mock with threadpool + async_listdir = AsyncMock(side_effect=Exception("Failed to list directory")) + threadpool.async_wrap = MagicMock(return_value=async_listdir) + + voices = await tts_service.list_voices() + assert voices == [] def mock_model_setup(cuda_available=False): @@ -176,7 +183,8 @@ def test_save_audio(tts_service, sample_audio, tmp_path): assert os.path.getsize(output_path) > 0 -def test_combine_voices(tts_service): +@pytest.mark.asyncio +async def test_combine_voices(tts_service): """Test combining multiple voices""" # Setup mocks for torch operations with patch('torch.load', return_value=torch.tensor([1.0, 2.0])), \ @@ -186,20 +194,21 @@ def test_combine_voices(tts_service): patch('os.path.exists', return_value=True): # Test combining two voices - result = tts_service.combine_voices(["voice1", "voice2"]) + result = await tts_service.combine_voices(["voice1", "voice2"]) assert result == "voice1_voice2" -def test_combine_voices_invalid_input(tts_service): +@pytest.mark.asyncio +async def test_combine_voices_invalid_input(tts_service): """Test combining voices with invalid input""" # Test with empty list with pytest.raises(ValueError, match="At least 2 voices are required"): - tts_service.combine_voices([]) + await tts_service.combine_voices([]) # Test with single voice with pytest.raises(ValueError, match="At least 2 voices are required"): - tts_service.combine_voices(["voice1"]) + await tts_service.combine_voices(["voice1"]) @patch("api.src.services.tts_service.TTSService._get_voice_path") diff --git a/examples/openai_streaming_audio.py b/examples/openai_streaming_audio.py index ec5c210..3a009c3 100644 --- a/examples/openai_streaming_audio.py +++ b/examples/openai_streaming_audio.py @@ -34,7 +34,7 @@ def stream_to_speakers() -> None: with openai.audio.speech.with_streaming_response.create( model="kokoro", - voice="af", + voice="af_sky+af_bella+bm_george", response_format="pcm", # similar to WAV, but without a header chunk at the start. input="""My dear sir, that is just where you are wrong. That is just where the whole world has gone wrong. We are always getting away from the present moment. Our mental existences, which are immaterial and have no dimensions, are passing along the Time-Dimension with a uniform velocity from the cradle to the grave. Just as we should travel down if we began our existence fifty miles above the earth’s surface""", ) as response: diff --git a/examples/speech.mp3 b/examples/speech.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b5c9ddca8ed45b5eb37d0ca8eb2a8d51295a9b1a GIT binary patch literal 80640 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

7ox-`87t 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