внутренняя модель перестроена вокруг аудиозаписи
- audiorecords вместо transcribe_jobs: приложения (texts, structures, recognitions, record_events, topics) живут своими коллекциями, ссылки на исходник и на приведённую копию перестали переставляться - рубеж называет достигнутое, отказ стал признаком остановки с причиной, а сторожей стало двое: число отказов и время в рубеже - воркеры потеряли специализацию, их число задаётся [pipeline] workers, шаг выбирается по рубежу, а захват отдаёт идентификатор и признак захвата
This commit is contained in:
@@ -2,22 +2,79 @@ package recognizer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"io"
|
||||
|
||||
"git.vakhrushev.me/av/transcriber/internal/entity"
|
||||
"github.com/google/uuid"
|
||||
|
||||
"git.vakhrushev.me/av/transcriber/internal/entity"
|
||||
)
|
||||
|
||||
// MemoryAudioRecognizer — подставной распознаватель для местного запуска и
|
||||
// проверок. Прогон на реальных ключах ради проверки кода запрещён: распознавание
|
||||
// и хранение в Object Storage оплачиваются по факту.
|
||||
//
|
||||
// Сырой ответ он отдаёт своего вида, но настоящего: тем же путём, что и живой
|
||||
// адаптер, — сохранённые байты разбираются обратно в реплики, и структура
|
||||
// строится без единого обращения наружу.
|
||||
type MemoryAudioRecognizer struct{}
|
||||
|
||||
func (r *MemoryAudioRecognizer) Recognize(ctx context.Context, file io.Reader, fileName string) (operationID string, err error) {
|
||||
const memoryProvider = "memory"
|
||||
|
||||
func (r *MemoryAudioRecognizer) Provider() string { return memoryProvider }
|
||||
|
||||
func (r *MemoryAudioRecognizer) Model() string { return "memory" }
|
||||
|
||||
func (r *MemoryAudioRecognizer) Upload(ctx context.Context, file io.Reader, objectKey string) (string, error) {
|
||||
return "memory://" + objectKey, nil
|
||||
}
|
||||
|
||||
func (r *MemoryAudioRecognizer) ObjectExists(ctx context.Context, objectKey string, size int64) (bool, error) {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
func (r *MemoryAudioRecognizer) Submit(ctx context.Context, sourceURI string) (string, error) {
|
||||
return uuid.NewString(), nil
|
||||
}
|
||||
|
||||
func (r *MemoryAudioRecognizer) GetRecognitionText(ctx context.Context, operationID string) (string, error) {
|
||||
return "Foo bar, Baz.", nil
|
||||
}
|
||||
|
||||
func (r *MemoryAudioRecognizer) CheckRecognitionStatus(ctx context.Context, operationID string) (*entity.RecognitionResult, error) {
|
||||
func (r *MemoryAudioRecognizer) CheckStatus(ctx context.Context, operationID string) (*entity.RecognitionResult, error) {
|
||||
return entity.NewCompletedResult(), nil
|
||||
}
|
||||
|
||||
func (r *MemoryAudioRecognizer) Fetch(ctx context.Context, operationID string) (*entity.RecognitionOutcome, error) {
|
||||
replicas := []entity.Replica{
|
||||
{StartMs: 0, EndMs: 1000, Text: "Foo bar,"},
|
||||
{StartMs: 1000, EndMs: 2000, Text: "Baz."},
|
||||
}
|
||||
raw, err := json.Marshal(replicas)
|
||||
if err != nil {
|
||||
return nil, errors.New("failed to encode memory payload")
|
||||
}
|
||||
return &entity.RecognitionOutcome{
|
||||
Replicas: replicas,
|
||||
PlainText: "Foo bar, Baz.",
|
||||
Raw: raw,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (r *MemoryAudioRecognizer) Parse(raw []byte) (*entity.RecognitionOutcome, error) {
|
||||
var replicas []entity.Replica
|
||||
if err := json.Unmarshal(raw, &replicas); err != nil {
|
||||
return nil, errors.New("failed to decode memory payload")
|
||||
}
|
||||
|
||||
var plain []byte
|
||||
for _, replica := range replicas {
|
||||
if len(plain) > 0 {
|
||||
plain = append(plain, ' ')
|
||||
}
|
||||
plain = append(plain, replica.Text...)
|
||||
}
|
||||
|
||||
return &entity.RecognitionOutcome{
|
||||
Replicas: replicas,
|
||||
PlainText: string(plain),
|
||||
Raw: raw,
|
||||
}, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user