68 lines
2.4 KiB
Go
68 lines
2.4 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/rs/zerolog/log"
|
|
ltr "github.com/snakesel/libretranslate"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
type Transcription struct {
|
|
ID primitive.ObjectID `bson:"_id,omitempty" json:"id"`
|
|
Status int `bson:"status" json:"status"`
|
|
Language string `bson:"language" json:"language"`
|
|
ModelSize string `bson:"modelSize" json:"modelSize"`
|
|
Task string `bson:"task" json:"task"`
|
|
Device string `bson:"device" json:"device"`
|
|
FileName string `bson:"fileName" json:"fileName"`
|
|
SourceUrl string `bson:"sourceUrl" json:"sourceUrl"`
|
|
Result WhisperResult `bson:"result" json:"result"`
|
|
Translations []Translation `bson:"translations" json:"translations"`
|
|
}
|
|
|
|
func (t *Transcription) Translate(target string) error {
|
|
for _, translation := range t.Translations {
|
|
if translation.TargetLanguage == target {
|
|
log.Debug().Msgf("Translation for %v already exists!", target)
|
|
return fmt.Errorf("translation for %v already exists", target)
|
|
}
|
|
}
|
|
|
|
translate := ltr.New(ltr.Config{
|
|
Url: fmt.Sprintf("http://%v", os.Getenv("TRANSLATION_ENDPOINT")),
|
|
})
|
|
|
|
var translation Translation
|
|
translation.SourceLanguage = t.Language
|
|
translation.TargetLanguage = target
|
|
|
|
trtext, err := translate.Translate(t.Result.Text, translation.SourceLanguage, translation.TargetLanguage)
|
|
if err != nil {
|
|
log.Debug().Err(err).Msgf("Error translating text...")
|
|
return err
|
|
}
|
|
translatedText := trtext
|
|
|
|
translatedSegments := make([]Segment, len(t.Result.Segments))
|
|
copy(translatedSegments, t.Result.Segments)
|
|
for i, seg := range t.Result.Segments {
|
|
trtext, err := translate.Translate(seg.Text, translation.SourceLanguage, translation.TargetLanguage)
|
|
if err != nil {
|
|
log.Debug().Err(err).Msgf("Error translating segment text...")
|
|
return err
|
|
}
|
|
translatedSegments[i].Text = trtext
|
|
// Word-level data is lost, since we can't make sure that words will be in the same order and number as the final translation.
|
|
// For example, if we translate "The big home" to Spanish, we could get "La casa grande", thus words changed order.
|
|
translatedSegments[i].Words = []Word{}
|
|
}
|
|
|
|
translation.Result.Text = translatedText
|
|
translation.Result.Segments = translatedSegments
|
|
translation.Result.Language = translation.TargetLanguage
|
|
t.Translations = append(t.Translations, translation)
|
|
return nil
|
|
}
|