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:
parent
dd408d36bc
commit
7fc439530c
20
internal/translate/lingvatranslate/decoder.go
Normal file
20
internal/translate/lingvatranslate/decoder.go
Normal 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
|
||||||
|
}
|
@ -7,12 +7,10 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"time"
|
||||||
// "time"
|
|
||||||
|
|
||||||
"github.com/eeeXun/gtt/internal/translate/core"
|
"github.com/eeeXun/gtt/internal/translate/core"
|
||||||
// "github.com/hajimehoshi/go-mp3"
|
"github.com/hajimehoshi/oto/v2"
|
||||||
// "github.com/hajimehoshi/oto/v2"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -117,6 +115,54 @@ func (t *LingvaTranslate) Translate(message string) (translation, definition, pa
|
|||||||
|
|
||||||
func (t *LingvaTranslate) PlayTTS(lang, message string) error {
|
func (t *LingvaTranslate) PlayTTS(lang, message string) error {
|
||||||
defer t.ReleaseLock()
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user