119 lines
4.7 KiB
Markdown
119 lines
4.7 KiB
Markdown
# Дьяк — система управления протоколами встреч
|
||
|
||
Frappe 16 приложение для загрузки аудиозаписей встреч, автоматической
|
||
транскрибации и диаризации (через внешний микросервис) и структурированного
|
||
ведения протокола.
|
||
|
||
## Установка
|
||
|
||
> Предполагается, что Frappe 16 + bench уже установлен.
|
||
|
||
```bash
|
||
# 1. Положить эту папку (`dyak/`) в `frappe-bench/apps/`
|
||
cd ~/frappe-bench/apps
|
||
# (скопируйте/распакуйте сюда содержимое архива — должен получиться
|
||
# каталог frappe-bench/apps/dyak/ с setup.py внутри)
|
||
|
||
# 2. Зарегистрировать приложение в bench
|
||
cd ~/frappe-bench
|
||
bench --site <ваш_сайт> install-app dyak
|
||
|
||
# 3. Применить фикстуры (создаёт роль Dyak User)
|
||
bench --site <ваш_сайт> migrate
|
||
|
||
# 4. (опционально) собрать assets
|
||
bench build --app dyak
|
||
|
||
# 5. Перезапустить
|
||
bench restart
|
||
```
|
||
|
||
После установки в Desk появится модуль **Дьяк** с doctype'ами:
|
||
|
||
* **Meeting Record** (`MR-YYYY-#####`) — основной документ встречи.
|
||
* **Dyak Settings** (Singleton) — настройки сервиса транскрибации и LLM.
|
||
* 8 child-tables: Meeting Participant, Action Item, Decision, Problem,
|
||
Open Question, Schedule Change, Help Request, External Reference.
|
||
|
||
## Конфигурация
|
||
|
||
В **Dyak Settings** заполните:
|
||
|
||
| Поле | Значение по умолчанию |
|
||
| --- | --- |
|
||
| URL сервиса | `http://192.168.1.112:8000` |
|
||
| Модель Whisper | `large-v3` |
|
||
| Язык | `ru` |
|
||
| Подсказка | (термины, разделённые запятыми) |
|
||
| Количество спикеров | `0` (автоопределение) |
|
||
|
||
## Поток работы
|
||
|
||
```
|
||
Черновик
|
||
└─[кнопка «Транскрибировать»]──▶ В обработке
|
||
└─(background job)──────▶ Расшифровано
|
||
├─[кнопка «Назначить спикеров»]
|
||
├─[AI: задачи / резюме / анализ — заглушки]
|
||
└─[кнопка «На проверку»]──────▶ Проверено
|
||
└─[«Утвердить»]──▶ Утверждено
|
||
```
|
||
|
||
При ошибке транскрибации статус возвращается в **Черновик**, трейсбек
|
||
пишется в Error Log.
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
dyak/
|
||
├── api/
|
||
│ ├── transcribe.py # whitelisted transcribe() + фоновый _run_transcription()
|
||
│ └── ai.py # заглушки extract_action_items, generate_summary, analyze_meeting
|
||
├── dyak/doctype/
|
||
│ ├── meeting_record/ # JSON + .py + .js (формовая логика)
|
||
│ ├── dyak_settings/ # Singleton с настройками
|
||
│ └── meeting_<...>/ # 8 child-tables
|
||
└── hooks.py
|
||
```
|
||
|
||
### Микросервис транскрибации
|
||
|
||
`POST {service_url}/process` — multipart/form-data:
|
||
|
||
```
|
||
file <bytes> аудиофайл
|
||
language ru код языка
|
||
initial_prompt str подсказка (опц.)
|
||
num_speakers int 0 = auto
|
||
model str tiny|base|...|large-v3|turbo (опц.)
|
||
```
|
||
|
||
Ответ:
|
||
|
||
```json
|
||
{
|
||
"language": "ru",
|
||
"duration": 197.6,
|
||
"processing_time": 18.2,
|
||
"speakers": {"SPEAKER_01": 113.5, "SPEAKER_02": 41.2},
|
||
"num_speakers": 3,
|
||
"utterances": [
|
||
{"speaker": "SPEAKER_01", "start": 0.0, "end": 94.6, "text": "..."}
|
||
]
|
||
}
|
||
```
|
||
|
||
Полный ответ кладётся в `Meeting Record.utterances_json` и используется
|
||
для рендеринга чат-диалога с цветами по спикерам.
|
||
|
||
## Точки расширения
|
||
|
||
* `dyak/api/ai.py` — заменить `msgprint` на реальные LLM-вызовы
|
||
(Anthropic/OpenAI/Ollama по `Dyak Settings.llm_provider`),
|
||
заполняющие `summary`, `action_items`, `decisions`, `problems`,
|
||
`open_questions`, `help_requests`, `external_references`,
|
||
`meeting_topics`, `meeting_mood`.
|
||
* Расписание автоматической транскрибации сразу после загрузки —
|
||
можно добавить через `doc_events` в `hooks.py`
|
||
(например, `Meeting Record: after_insert`).
|