lct-02: замер задержки голосового контура, make latency
Замер на машине разработки (Ryzen 7 8845HS, WSL2), не на демо-машине — там make latency надо прогнать трижды, разброс между прогонами до 20%. Распознавание — GigaAM v3 RNNT int8: фраза на 2 с за ~285 мс, WER 0% на 99 словах живой речи Golos. CTC не быстрее ни в одном из двух прогонов и ошибается чаще: время съедает общий энкодер, поэтому ступень деградации «RNNT не успевает → CTC» по скорости ничего не даёт. Синтез — Silero v5: в 10 раз быстрее реального времени, а не в 40, как заложено в STACK.md; первая фраза 100–250 мс в зависимости от длины. Частота синтеза на скорость не влияет, без профилирующего компилятора — на 13% быстрее. Сквозной бюджет: 600 мс endpointing + ~285 STT + ~150 TTS = ~1 с без LLM. Цель ≤ 1.5 с держится, только если LLM отдаёт первое предложение быстрее ~465 мс. Вопрос, считается ли филлер «алло?..» первым звуком, записан в LATENCY.md для людей. make models качает GigaAM и Silero VAD с Hugging Face. Silero TTS лежит на российском хосте, недоступном из-под VPN: скрипт не лезет на зеркала (.pt грузится через pickle — это чужой код) и честно говорит, откуда скачать вручную.
This commit is contained in:
parent
f24031b5b2
commit
dcdec56779
5 changed files with 335 additions and 256 deletions
|
|
@ -1,7 +1,8 @@
|
|||
"""make models: веса моделей в backend/models/.
|
||||
|
||||
Сейчас качает эмбеддинги для слот-автомата. Распознавание (GigaAM) и синтез
|
||||
(Silero) добавит карточка lct-02 — после замера на демо-машине.
|
||||
Эмбеддинги, распознавание (GigaAM v3, int8) и VAD качаются с Hugging Face.
|
||||
Синтез (Silero TTS v5) лежит на models.silero.ai — российском хосте, который
|
||||
не отвечает из-под VPN: его скрипт не качает, а проверяет и говорит, что делать.
|
||||
Докачка продолжается с места обрыва: сеть на стенде бывает медленной.
|
||||
"""
|
||||
|
||||
|
|
@ -13,12 +14,27 @@ ROOT = Path(__file__).resolve().parents[1]
|
|||
MODELS = ROOT / "models"
|
||||
|
||||
E5 = "https://huggingface.co/Xenova/multilingual-e5-small/resolve/main/"
|
||||
GIGAAM = "https://huggingface.co/istupakov/gigaam-v3-onnx/resolve/main/"
|
||||
VAD = "https://huggingface.co/istupakov/silero-vad-onnx/resolve/main/"
|
||||
FILES = {
|
||||
"e5-small/config.json": E5 + "config.json",
|
||||
"e5-small/tokenizer.json": E5 + "tokenizer.json",
|
||||
"e5-small/model_quantized.onnx": E5 + "onnx/model_quantized.onnx",
|
||||
# RNNT — основная модель, CTC — запасная на случай, если RNNT не загрузится
|
||||
# (по скорости CTC не выигрывает — docs/LATENCY.md).
|
||||
"gigaam-v3-onnx/config.json": GIGAAM + "config.json",
|
||||
"gigaam-v3-onnx/v3_vocab.txt": GIGAAM + "v3_vocab.txt",
|
||||
"gigaam-v3-onnx/v3_rnnt_encoder.int8.onnx": GIGAAM + "v3_rnnt_encoder.int8.onnx",
|
||||
"gigaam-v3-onnx/v3_rnnt_decoder.int8.onnx": GIGAAM + "v3_rnnt_decoder.int8.onnx",
|
||||
"gigaam-v3-onnx/v3_rnnt_joint.int8.onnx": GIGAAM + "v3_rnnt_joint.int8.onnx",
|
||||
"gigaam-v3-onnx/v3_ctc.int8.onnx": GIGAAM + "v3_ctc.int8.onnx",
|
||||
"silero-vad/config.json": VAD + "config.json",
|
||||
"silero-vad/silero_vad.onnx": VAD + "silero_vad.onnx",
|
||||
}
|
||||
|
||||
SILERO_TTS = "silero-tts/v5_ru.pt"
|
||||
SILERO_TTS_URL = "https://models.silero.ai/models/tts/ru/v5_ru.pt"
|
||||
|
||||
|
||||
def fetch(url: str, target: Path) -> None:
|
||||
partial = target.with_suffix(target.suffix + ".part")
|
||||
|
|
@ -43,7 +59,18 @@ def main() -> None:
|
|||
continue
|
||||
target.parent.mkdir(parents=True, exist_ok=True)
|
||||
fetch(url, target)
|
||||
print("эмбеддинги готовы; GigaAM и Silero — карточка tasks/lct-02-latency-baseline.md")
|
||||
tts = MODELS / SILERO_TTS
|
||||
if tts.exists():
|
||||
print(f" {SILERO_TTS}: уже есть")
|
||||
print("все модели на месте")
|
||||
return 0
|
||||
# Не качаем с зеркал: .pt грузится через pickle, файл из непроверенного
|
||||
# источника — это чужой код на стенде.
|
||||
print(f"""
|
||||
{SILERO_TTS}: НЕТ. Хост models.silero.ai не отвечает из-под VPN — скачайте вручную:
|
||||
{SILERO_TTS_URL}
|
||||
и положите в backend/models/{SILERO_TTS}""")
|
||||
return 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
|||
Loading…
Reference in a new issue