v/GTT
1
0
mirror of https://github.com/eeeXun/GTT.git synced 2025-05-21 01:50:36 -07:00

tts decoder proto type

This commit is contained in:
eeeXun 2023-04-04 18:13:08 +08:00
parent dd408d36bc
commit 7fc439530c
2 changed files with 70 additions and 4 deletions

View File

@ -0,0 +1,20 @@
package lingvatranslate
type Decoder struct {
sampleRate int
length int64
pos int64
buf []byte
bytesPerFrame int64
}
func NewDecoder(buf []byte)*Decoder {
return &Decoder{
}
}
func (d *Decoder) Read(buf []byte) (int, error) {
n := copy(buf, d.buf)
d.buf = d.buf[n:]
d.pos += int64(n)
return n, nil
}

View File

@ -7,12 +7,10 @@ import (
"io/ioutil"
"net/http"
"net/url"
// "time"
"time"
"github.com/eeeXun/gtt/internal/translate/core"
// "github.com/hajimehoshi/go-mp3"
// "github.com/hajimehoshi/oto/v2"
"github.com/hajimehoshi/oto/v2"
)
const (
@ -117,6 +115,54 @@ func (t *LingvaTranslate) Translate(message string) (translation, definition, pa
func (t *LingvaTranslate) PlayTTS(lang, message string) error {
defer t.ReleaseLock()
var data map[string]interface{}
var voiceData []interface{}
urlStr := fmt.Sprintf(
textURL,
langCode[t.GetSrcLang()],
langCode[t.GetDstLang()],
url.PathEscape(message),
)
res, err := http.Get(urlStr)
if err != nil {
return err
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return err
}
if err = json.Unmarshal(body, &data); err != nil {
return err
}
if len(data) <= 0 {
return errors.New("Text to Speech not found")
}
data = data["pageProps"].(map[string]interface{})
if lang == data["initial"].(map[string]interface{})["source"] {
voiceData = data["audio"].(map[string]interface{})["query"].([]interface{})
} else {
voiceData = data["audio"].(map[string]interface{})["translation"].([]interface{})
}
voice, _ := json.Marshal(voiceData)
decoder := NewDecoder(voice)
otoCtx, readyChan, err := oto.NewContext(24000, 2, 2)
if err != nil {
return err
}
<-readyChan
player := otoCtx.NewPlayer(decoder)
for player.IsPlaying() {
if t.IsStopped() {
return nil
}
time.Sleep(time.Millisecond)
}
if err = player.Close(); err != nil {
return err
}
return nil
}