Files
whishper/backend/models/transcription.go
2023-08-26 10:36:05 +02:00

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
}