[文档、验收与归档]:完成真实运行说明和OpenSpec归档,包含README、最终门禁和主规范更新
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import math
|
||||
import base64
|
||||
import json
|
||||
import socket
|
||||
import struct
|
||||
@@ -166,12 +167,12 @@ class CloudTtsProvider:
|
||||
)
|
||||
payload = {
|
||||
"model": self.config.tts_model,
|
||||
"input": clean,
|
||||
"voice": self.config.tts_voice,
|
||||
"response_format": "mp3",
|
||||
"messages": [{"role": "assistant", "content": clean}],
|
||||
"audio": {"format": "wav", "voice": self.config.tts_voice},
|
||||
"stream": False,
|
||||
}
|
||||
request = urllib.request.Request(
|
||||
self.config.api_url("/v1/audio/speech"),
|
||||
self.config.api_url("/v1/chat/completions"),
|
||||
data=json.dumps(payload).encode("utf-8"),
|
||||
headers={
|
||||
"Authorization": f"Bearer {self.config.llm_api_key}",
|
||||
@@ -181,7 +182,7 @@ class CloudTtsProvider:
|
||||
)
|
||||
try:
|
||||
with self.urlopen(request, timeout=self.timeout_s) as response:
|
||||
data = response.read()
|
||||
payload = json.loads(response.read().decode("utf-8"))
|
||||
except urllib.error.HTTPError as exc:
|
||||
raise ProviderError(
|
||||
ErrorCode.TTS_SYNTHESIS_FAILED,
|
||||
@@ -190,7 +191,7 @@ class CloudTtsProvider:
|
||||
"newapi-tts",
|
||||
"tts",
|
||||
) from exc
|
||||
except (urllib.error.URLError, TimeoutError, socket.timeout) as exc:
|
||||
except (urllib.error.URLError, TimeoutError, socket.timeout, json.JSONDecodeError) as exc:
|
||||
raise ProviderError(
|
||||
ErrorCode.TTS_SYNTHESIS_FAILED,
|
||||
f"cloud TTS request failed: {exc}",
|
||||
@@ -198,7 +199,11 @@ class CloudTtsProvider:
|
||||
"newapi-tts",
|
||||
"tts",
|
||||
) from exc
|
||||
if not data:
|
||||
choices = payload.get("choices") or []
|
||||
message = (choices[0].get("message") if choices else {}) or {}
|
||||
audio = message.get("audio") or {}
|
||||
encoded = audio.get("data")
|
||||
if not encoded:
|
||||
raise ProviderError(
|
||||
ErrorCode.TTS_EMPTY_AUDIO,
|
||||
"cloud TTS returned empty audio",
|
||||
@@ -206,4 +211,14 @@ class CloudTtsProvider:
|
||||
"newapi-tts",
|
||||
"tts",
|
||||
)
|
||||
return AudioSegment(data, 16000, 1, 0, max(120, len(clean) * 45), {"text": clean, "format": "mp3"})
|
||||
try:
|
||||
data = base64.b64decode(encoded)
|
||||
except (TypeError, ValueError) as exc:
|
||||
raise ProviderError(
|
||||
ErrorCode.TTS_SYNTHESIS_FAILED,
|
||||
f"cloud TTS returned invalid base64 audio: {exc}",
|
||||
True,
|
||||
"newapi-tts",
|
||||
"tts",
|
||||
) from exc
|
||||
return AudioSegment(data, 24000, 1, 0, max(120, len(clean) * 45), {"text": clean, "format": "wav"})
|
||||
|
||||
Reference in New Issue
Block a user