Атомарная цель. Выбрать sherpa_onnx_asr и pyttsx3_tts, проверить русское распознавание и локальное воспроизведение без cloud API.
Что мы делаем и зачем
Голосовой цикл состоит из независимых частей: захват микрофона, VAD, ASR, LLM и TTS. Один успешный текстовый ответ не доказывает микрофон или звук. Поэтому сохраняются отдельные доказательства распознавания фразы с уникальным числом и слышимого ответа.
Что должно быть готово
- Эксперимент 7 работает.
- Микрофон разрешён браузеру на localhost.
- В Windows установлен хотя бы один русский SAPI voice.
Где выполнять
Обычный PowerShell для списка voices и сервера; браузер для одного voice cycle.
Scope
| Разрешено | Только действия, прямо указанные в prompt и командах этого эксперимента. |
|---|---|
| Запрещено | Секреты, изменение main/upstream, расширение scope и скрытое исправление новых ошибок. |
| Результат | Артефакты и критерии на третьей странице эксперимента. |
Откройте Codex из папки, указанной на предыдущей странице. Для независимого аудита обязательно создайте новую сессию. Скопируйте следующий prompt целиком, не вырезая ограничения.
PROMPT ДЛЯ CODEX - КОПИРОВАТЬ ЦЕЛИКОМ
Работай как инженер в режиме контролируемого агента.
Перед любым изменением покажи карту релевантной части репозитория, одну атомарную цель, файлы чтения и изменения, риски и команды проверки.
Сначала покажи план. Не меняй файлы до моего явного подтверждения.
Не используй sudo, force push, git reset --hard, git clean -fd и опасные команды удаления.
Не переключай и не изменяй main.
Не читай и не печатай .env, токены, SSH-ключи, cookies и keychain.
Не трогай файлы за пределами указанного scope.
Не скрывай ошибки и не подменяй тест словесным утверждением.
После изменения покажи краткий diff, реальный минимальный тест и git status --short.
Если нужен больший scope, остановись и запроси новый атомарный шаг.
Текущая задача: настроить только local voice baseline в conf.yaml. Не меняй source code, templates и dependencies. Не отправляй аудио в cloud API.
Сначала найди точные существующие ASR/TTS keys и Pydantic Literal-значения. Покажи план для character_config.asr_config.asr_model = sherpa_onnx_asr и character_config.tts_config.tts_model = pyttsx3_tts. Найди pyttsx3_tts.voice_name, если он поддерживается текущей схемой. После подтверждения измени только эти keys.
Затем выполни PowerShell-совместимый список pyttsx3 voices, запусти verbose server и проведи один microphone smoke test с фразой «Проверка локального распознавания 4827». В логах не показывай другое содержание речи. После одного ответа выключи микрофон и проверь отсутствие feedback loop.Команды PowerShell
Команды ниже нужны либо для ручного выполнения, либо для сверки предложения Codex. Строки после комментария «после подтверждения» не запускаются заранее.
КОМАНДЫ - КОПИРОВАТЬ ПО ПОРЯДКУ
@'
import pyttsx3
engine = pyttsx3.init()
for voice in engine.getProperty("voices"):
print(voice.id, voice.name, getattr(voice, "languages", []))
'@ | uv run python -
uv run run_server.py --verboseКак действовать при запросе разрешения
Прочитайте команду и рабочую папку; сразу сверьте их со scope этого эксперимента.
Для одной безопасной команды выберите разовое Yes, proceed.
Если команда читает секреты, пишет за пределами scope или меняет main - нажмите Esc и объясните ограничение.
Что должно получиться
- Список voices напечатан без персональных путей.
- ASR transcript содержит смысл фразы и уникальное число 4827.
- Пользователь слышит локальный TTS-ответ.
- После выключения микрофона новых циклов нет.
Типовые ошибки и действия
- pyttsx3 literal_error: использовать pyttsx3_tts, а не имя Python-класса.
- TTS object has no attribute: это source/backend contract; не патчить source внутри config-only шага.
- Русский voice отсутствует: установить Windows language/voice отдельно, не добавлять cloud TTS.
- Feedback loop: снизить громкость, включить VAD/echo control и остановить capture после одного цикла.
Артефакты и доказательства
Критерий завершения
ГОТОВАЯ ЗАПИСЬ В ОТЧЁТ
Эксперимент 8: Русский локальный voice baseline | Статус: PASS / FAIL / NOT PROVEN
Доказательство: <минимальный обезличенный вывод> | Не доказано: <ограничение>
Source tree: unchanged / <известный diff> | Следующий шаг: Если эксперименты 1-8 уже выполнялись, пройти контрольную точку 8.5 вместо полного повтора.