96 lines
2.1 KiB
Go
96 lines
2.1 KiB
Go
package yandex
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
|
|
"git.vakhrushev.me/av/transcriber/internal/entity"
|
|
)
|
|
|
|
type YandexAudioRecognizerConfig struct {
|
|
// s3
|
|
Region string
|
|
AccessKey string
|
|
SecretKey string
|
|
BucketName string
|
|
Endpoint string
|
|
// speech kit
|
|
ApiKey string
|
|
FolderID string
|
|
}
|
|
|
|
type YandexAudioRecognizerService struct {
|
|
s3Sevice *yandexS3Service
|
|
sttService *speechKitService
|
|
}
|
|
|
|
func NewYandexAudioRecognizerService(cfg YandexAudioRecognizerConfig) (*YandexAudioRecognizerService, error) {
|
|
s3, err := newYandexS3Service(s3Config{
|
|
Region: cfg.Region,
|
|
AccessKey: cfg.AccessKey,
|
|
SecretKey: cfg.SecretKey,
|
|
BucketName: cfg.BucketName,
|
|
Endpoint: cfg.Endpoint,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
stt, err := newSpeechKitService(speechKitConfig{
|
|
ApiKey: cfg.ApiKey,
|
|
FolderID: cfg.FolderID,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &YandexAudioRecognizerService{
|
|
s3Sevice: s3,
|
|
sttService: stt,
|
|
}, nil
|
|
}
|
|
|
|
func (s *YandexAudioRecognizerService) Close() error {
|
|
return s.sttService.Close()
|
|
}
|
|
|
|
func (s *YandexAudioRecognizerService) RecognizeFile(filePath string) (string, error) {
|
|
fileName := filepath.Base(filePath)
|
|
|
|
err := s.s3Sevice.uploadFile(filePath, fileName)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
uri := s.s3Sevice.fileUrl(fileName)
|
|
|
|
opId, err := s.sttService.recognizeFileFromS3(uri)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return opId, nil
|
|
}
|
|
|
|
func (s *YandexAudioRecognizerService) GetRecognitionText(operationID string) (string, error) {
|
|
return s.sttService.getRecognitionText(operationID)
|
|
}
|
|
|
|
func (s *YandexAudioRecognizerService) CheckRecognitionStatus(operationID string) (*entity.RecognitionResult, error) {
|
|
operation, err := s.sttService.checkOperationStatus(operationID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if !operation.Done {
|
|
return entity.NewInProgressResult(), nil
|
|
}
|
|
|
|
if opErr := operation.GetError(); opErr != nil {
|
|
errorText := fmt.Sprintf("operation failed: code %d, message: %s", opErr.Code, opErr.Message)
|
|
return entity.NewFailedResult(errorText), nil
|
|
}
|
|
|
|
return entity.NewCompletedResult(), nil
|
|
}
|