feat: распознавание голоса пациента (STT через OpenRouter + mock) #122

Merged
Eleboba merged 2 commits from feat/116-stt into dev 2026-10-31 11:37:06 +03:00
3 changed files with 6 additions and 3 deletions
Showing only changes of commit d700608825 - Show all commits
+2
View File
@@ -108,6 +108,8 @@ class OpenRouterSTT:
"messages": [{"role": "system", "content": texts.system}, {"role": "user", "content": content}], "messages": [{"role": "system", "content": texts.system}, {"role": "user", "content": content}],
"temperature": 0, "temperature": 0,
"max_tokens": 800, "max_tokens": 800,
# Transcription needs no thinking: with reasoning on, gemini-2.5-flash takes ~60 s instead of ~3 s.
"reasoning": {"enabled": False},
} }
data = await self._post(body) data = await self._post(body)
try: try:
+3 -3
View File
@@ -4,11 +4,11 @@
# Системная инструкция модели распознавания. # Системная инструкция модели распознавания.
system: >- system: >-
Ты — система распознавания речи. Дословно расшифруй русскую речь из аудио. Ты — система распознавания речи. Дословно расшифруй русскую речь из аудио.
Выведи только расшифровку: без кавычек, пояснений, перевода и ответа на сказанное. Выведи только расшифровку: без кавычек, пояснений и ответа на сказанное.
Ставь знаки препинания. Если речи нет или её не разобрать — выведи ровно [тишина]. Ставь знаки препинания. Если в записи совсем нет речи — выведи ровно [тишина].
# Текст рядом с аудио в сообщении пользователя. # Текст рядом с аудио в сообщении пользователя.
user: "Расшифруй запись." user: "Расшифруй эту аудиозапись."
# Что модель возвращает, если речи нет (сравнивается без учёта регистра). # Что модель возвращает, если речи нет (сравнивается без учёта регистра).
silence_marker: "[тишина]" silence_marker: "[тишина]"
+1
View File
@@ -66,6 +66,7 @@ async def test_openrouter_sends_audio_and_returns_transcript() -> None:
assert await stt.transcribe(audio) == "Сегодня плохо спал." assert await stt.transcribe(audio) == "Сегодня плохо спал."
body = sent[0] body = sent[0]
assert body["model"] == "google/gemini-2.5-flash" and body["temperature"] == 0 assert body["model"] == "google/gemini-2.5-flash" and body["temperature"] == 0
assert body["reasoning"] == {"enabled": False}
part = body["messages"][1]["content"][1] part = body["messages"][1]["content"][1]
assert part["type"] == "input_audio" and part["input_audio"]["format"] == "wav" assert part["type"] == "input_audio" and part["input_audio"]["format"] == "wav"
assert base64.b64decode(part["input_audio"]["data"]) == audio assert base64.b64decode(part["input_audio"]["data"]) == audio