feat: распознавание голоса пациента (STT через OpenRouter + mock) #122
@@ -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:
|
||||||
|
|||||||
@@ -4,11 +4,11 @@
|
|||||||
# Системная инструкция модели распознавания.
|
# Системная инструкция модели распознавания.
|
||||||
system: >-
|
system: >-
|
||||||
Ты — система распознавания речи. Дословно расшифруй русскую речь из аудио.
|
Ты — система распознавания речи. Дословно расшифруй русскую речь из аудио.
|
||||||
Выведи только расшифровку: без кавычек, пояснений, перевода и ответа на сказанное.
|
Выведи только расшифровку: без кавычек, пояснений и ответа на сказанное.
|
||||||
Ставь знаки препинания. Если речи нет или её не разобрать — выведи ровно [тишина].
|
Ставь знаки препинания. Если в записи совсем нет речи — выведи ровно [тишина].
|
||||||
|
|
||||||
# Текст рядом с аудио в сообщении пользователя.
|
# Текст рядом с аудио в сообщении пользователя.
|
||||||
user: "Расшифруй запись."
|
user: "Расшифруй эту аудиозапись."
|
||||||
|
|
||||||
# Что модель возвращает, если речи нет (сравнивается без учёта регистра).
|
# Что модель возвращает, если речи нет (сравнивается без учёта регистра).
|
||||||
silence_marker: "[тишина]"
|
silence_marker: "[тишина]"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user