- 形仪域 domains/xingyi:form_anchors(稳定辨识特征/年龄表现/许可禁忌/可变范围——生成内容不可静默覆盖锚点);forms(主仪/化仪/文字形仪,candidate→adopt 定相治理:未定相不进呈现位、主仪唯一、新主仪自动退役旧主仪);voice_profiles(三来源,授权克隆必填用途与传播范围,revoke-grant 撤回立即生效,assert-usable 合成前置校验拒绝撤回/过期) - ASR:元炁 SenseVoice /v1/audio/transcriptions 透传(Whisper 兼容 multipart);YUANQI_BASE_URL 未配置时 503 不降级不伪造——多模态关闭纪律 - 前端形仪工坊(人物详情页):真形锚点编辑(特征逐行解析)/候选登记定相废弃/声音档案建立与授权撤回;头像呈现位改走定相主仪(forms/primary);xingyi api 库 + mock + 组件 4 用例 - 退役:旧 avatar 模块(services/endpoints/avatar、avatar_dir 配置、avatar_url 字段、前端直传组件与测试) - 验收(test_m7_xingyi 三用例):未定相不成为正式形仪(含主仪唯一与旧主仪 retired 断言);克隆授权可撤回(缺用途拒/撤回即拒/过期同理/预设不受约束);关闭全部多模态后文字相伴完整可用(ASR 503 时镜树缘契百工照常——回归) - 四套件:后端 376、前端 203、BFF 4、神识 5 包全绿(2 个预存环境失败不变);迁移 008 净库+±1 干净
44 lines
1.6 KiB
Python
44 lines
1.6 KiB
Python
"""ASR 转写客户端:灵台 → 元炁 ``/v1/audio/transcriptions``(Whisper 兼容 multipart)。
|
||
|
||
多模态关闭纪律:YUANQI_BASE_URL 未配置(或调用失败)时 503,不降级、不伪造转写;
|
||
文字相伴链路(镜树/缘契/百工)不依赖本模块——关闭全部多模态后完整可用。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import httpx
|
||
|
||
from app.core.config import settings
|
||
from app.core.errors import AppError
|
||
|
||
_TIMEOUT_SECONDS = 120.0 # 本地推理首包较慢,给足窗口
|
||
|
||
|
||
async def transcribe(audio_bytes: bytes, filename: str) -> dict:
|
||
base_url = settings.yuanqi_base_url
|
||
if not base_url:
|
||
raise AppError(
|
||
"service_unavailable",
|
||
"语音转写未启用(YUANQI_BASE_URL 未配置,多模态已关闭)。",
|
||
status_code=503,
|
||
)
|
||
async with httpx.AsyncClient(trust_env=False, timeout=_TIMEOUT_SECONDS) as client:
|
||
response = await client.post(
|
||
f"{base_url.rstrip('/')}/v1/audio/transcriptions",
|
||
files={"file": (filename, audio_bytes)},
|
||
data={"model": settings.yuanqi_asr_model},
|
||
)
|
||
if response.status_code >= 400:
|
||
raise AppError(
|
||
"service_unavailable",
|
||
f"元炁转写失败(HTTP {response.status_code}):{response.text[:200]}",
|
||
status_code=502,
|
||
)
|
||
data = response.json()
|
||
text = data.get("text") or ""
|
||
return {
|
||
"text": text,
|
||
"engine": "yuanqi.sensevoice",
|
||
"original": text, # ASR 原转写(与正影文本并存的语义由镜树承载)
|
||
}
|