.
This commit is contained in:
+13
-6
@@ -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)}"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user