внутренняя модель перестроена вокруг аудиозаписи

- audiorecords вместо transcribe_jobs: приложения (texts, structures,
  recognitions, record_events, topics) живут своими коллекциями, ссылки на
  исходник и на приведённую копию перестали переставляться
- рубеж называет достигнутое, отказ стал признаком остановки с причиной, а
  сторожей стало двое: число отказов и время в рубеже
- воркеры потеряли специализацию, их число задаётся [pipeline] workers, шаг
  выбирается по рубежу, а захват отдаёт идентификатор и признак захвата
This commit is contained in:
av
2026-08-14 20:20:33 +03:00
parent d079f03350
commit 1576d06735
84 changed files with 8973 additions and 2865 deletions
+44 -2
View File
@@ -1,6 +1,8 @@
package entity
// RecognitionStatus представляет статус операции транскрипции
import "time"
// RecognitionStatus представляет статус операции распознавания у провайдера.
type RecognitionStatus int
const (
@@ -26,7 +28,7 @@ func (s RecognitionStatus) String() string {
}
}
// RecognitionResult представляет результат операции транскрипции
// RecognitionResult представляет исход опроса операции распознавания.
type RecognitionResult struct {
Status RecognitionStatus
Error string // Текст ошибки (заполняется при StatusFailed)
@@ -76,3 +78,43 @@ func (r *RecognitionResult) GetError() string {
}
return ""
}
// Recognition — попытка распознавания у внешнего провайдера.
//
// Всё провайдерское живёт здесь, а не колонками записи: идентификатор операции —
// самое провайдерское, что есть в модели, а копия аудио во внешнем хранилище
// существует только потому, что сегодняшний провайдер читает запись по адресу.
// Другой провайдер её не потребует, и смена провайдера не трогает доменную
// сущность вовсе.
//
// Сырой ответ хранится вложением, а не колонкой этой строки: шаг опроса читает
// её раз в несколько секунд, а хранилище читает запись целиком — ответ на
// многочасовую запись ехал бы в память при каждом опросе. Хранится он потому,
// что результат операции у провайдера не переспрашивается.
type Recognition struct {
Id string
RecordID string
Provider string
Model string
// ExternalID — идентификатор операции у провайдера. Заводится **до**
// обращения к нему: окно между ответом провайдера и записью идентификатора —
// то место, где теряется оплаченное.
ExternalID string
// SourceURI — адрес, по которому провайдер читает аудио.
SourceURI string
StartedAt *time.Time
FinishedAt *time.Time
}
// RecognitionOutcome — доменный результат распознавания, каким его отдаёт
// адаптер. Формата провайдера здесь нет: разбор потока — обязанность адаптера, и
// ни один шаг конвейера не знает, каким потоком и какими полями провайдер
// отвечает.
type RecognitionOutcome struct {
// Replicas — реплики со временем от начала записи.
Replicas []Replica
// PlainText — плоский текст расшифровки.
PlainText string
// Raw — ответ провайдера целиком, как он пришёл, на хранение вложением.
Raw []byte
}