package contract import ( "context" "io" "git.vakhrushev.me/av/transcriber/internal/entity" ) type AudioInfo struct { Seconds int // Длина аудиофайла в секундах } // Контекст первым доводом несут все интерфейсы, за которыми стоит внешний // собеседник — процесс `ffmpeg`, S3, SpeechKit. Он здесь не украшение: остановка // сервиса обязана доходить до чужой работы, а не оставлять её сиротой. Без него // конвертация шестичасовой записи переживает остановку воркера, а запрос к // платному распознаванию висит до собственного таймаута библиотеки. type AudioMetaViewer interface { GetInfo(ctx context.Context, src string) (*AudioInfo, error) } type AudioFileConverter interface { Convert(ctx context.Context, src, dest string) error } type AudioRecognizer interface { Recognize(ctx context.Context, file io.Reader, fileName string) (operationID string, err error) GetRecognitionText(ctx context.Context, operationID string) (string, error) CheckRecognitionStatus(ctx context.Context, operationID string) (*entity.RecognitionResult, error) } type TelegramMessageSender interface { Send(text string, chatId int64, replyToMessageId *int) error }