This commit is contained in:
Konturai DevOps
2026-05-02 00:48:40 +05:00
parent 676d7155bd
commit 8a83a4d575
6 changed files with 501 additions and 63 deletions
+13 -6
View File
@@ -166,7 +166,12 @@ class ElevenLabsTTS(BaseTTS):
self._voice_settings,
)
async def synthesize_stream(self, text_stream: AsyncIterable[str]) -> AsyncGenerator[bytes, None]:
async def synthesize_stream(
self,
text_stream: AsyncIterable[str],
*,
language_code: str | None = None,
) -> AsyncGenerator[bytes, None]:
if not self._api_key:
raise RuntimeError("ELEVENLABS_API_KEY is required for ElevenLabs TTS")
if not self._voice_id:
@@ -178,7 +183,8 @@ class ElevenLabsTTS(BaseTTS):
except Exception as exc: # noqa: BLE001
raise RuntimeError("The `websockets` package is required for ElevenLabs TTS WebSocket streaming") from exc
websocket_url = self._build_websocket_url()
effective_language_code = (str(language_code).strip() if language_code else "") or self._language_code
websocket_url = self._build_websocket_url(language_code=effective_language_code)
started_monotonic = time.perf_counter()
audio_chunk_count = 0
audio_byte_count = 0
@@ -193,7 +199,7 @@ class ElevenLabsTTS(BaseTTS):
self._output_format,
self._provider_sample_rate_hz,
self._target_sample_rate_hz,
self._language_code,
effective_language_code,
self._auto_mode,
)
try:
@@ -290,7 +296,7 @@ class ElevenLabsTTS(BaseTTS):
except OSError as exc:
raise RuntimeError("ElevenLabs TTS WebSocket connection failed") from exc
def _build_websocket_url(self) -> str:
def _build_websocket_url(self, *, language_code: str | None = None) -> str:
query = {
"model_id": self._model_id,
"output_format": self._output_format,
@@ -299,8 +305,9 @@ class ElevenLabsTTS(BaseTTS):
"sync_alignment": "false",
"apply_text_normalization": "auto",
}
if self._language_code:
query["language_code"] = self._language_code
effective_language = (str(language_code).strip() if language_code else "") or self._language_code
if effective_language:
query["language_code"] = effective_language
encoded_voice_id = quote(self._voice_id, safe="")
return f"{self._ws_base}/v1/text-to-speech/{encoded_voice_id}/stream-input?{urlencode(query)}"