v/GTT
1
0
mirror of https://github.com/eeeXun/GTT.git synced 2025-05-21 18:10:17 -07:00

feat: tts

This commit is contained in:
eeeXun 2023-02-19 02:46:33 +08:00
parent 40fe5397ab
commit bbb18c3614
2 changed files with 78 additions and 55 deletions

View File

@ -58,20 +58,25 @@ var (
"Ukrainian": "ukr",
}
voiceName = map[string]string{
"Arabic": "Mehdi22k",
"Chinese": "Lulu22k",
"Dutch": "Femke22k",
"English": "Heather22k",
"French": "Alice22k",
"German": "Claudia22k",
"Hebrew": "he-IL-Asaf",
"Italian": "Chiara22k",
"Japanese": "Sakura22k",
"Polish": "Ania22k",
"Portuguese": "Celia22k",
"Romanian": "ro-RO-Andrei",
"Russian": "Alyona22k",
"Spanish": "Ines22k",
"Turkish": "Ipek22k",
"Arabic": "Mehdi22k",
"Chinese (Simplified)": "Lulu22k",
"Czech": "Eliska22k",
"Danish": "Mette22k",
"Dutch": "Sofie22k",
"English": "Heather22k",
"French": "Alice22k",
"German": "Andreas22k",
"Greek": "Dimitris22k",
"Hebrew": "he-IL-Asaf",
"Italian": "Fabiana22k",
"Japanese": "Sakura22k",
"Korean": "Minji22k",
"Polish": "Monika22k",
"Portuguese": "Celia22k",
"Romanian": "ro-RO-Andrei",
"Russian": "Alyona22k",
"Spanish": "Antonio22k",
"Swedish": "Emma22k",
"Turkish": "Ipek22k",
}
)

View File

@ -1,11 +1,23 @@
// echo 'nice' | base64
// curl -A "Mozilla/4.0" \
// "https://voice.reverso.net/RestPronunciation.svc/v1/output=json/GetVoiceStream/voiceName=Heather22k?voiceSpeed=80&inputText=bmljZQ==" \
// --output a.mp
//
// curl -A "Mozilla/4.0" \
// "https://voice.reverso.net/RestPronunciation.svc/v1/output=json/GetVoiceStream/voiceName=Heather22k?voiceSpeed=80&inputText=bmljZQ==" \
// --output a.mp
package reversotranslate
import (
"encoding/base64"
"errors"
"fmt"
"net/http"
"time"
"github.com/hajimehoshi/go-mp3"
"github.com/hajimehoshi/oto/v2"
)
const (
ttsURL = "https://translate.google.com.vn/translate_tts?ie=UTF-8&q=%s&tl=%s&client=tw-ob"
ttsURL = "https://voice.reverso.net/RestPronunciation.svc/v1/output=json/GetVoiceStream/voiceName=%s?voiceSpeed=80&inputText=%s"
)
func (t *ReversoTranslate) LockAvailable() bool {
@ -21,42 +33,48 @@ func (t *ReversoTranslate) StopTTS() {
}
func (t *ReversoTranslate) PlayTTS(lang, message string) error {
// urlStr := fmt.Sprintf(
// ttsURL,
// url.QueryEscape(message),
// langCode[lang],
// )
// res, err := http.Get(urlStr)
// if err != nil {
// t.SoundLock.Release()
// return err
// }
// decoder, err := mp3.NewDecoder(res.Body)
// if err != nil {
// t.SoundLock.Release()
// return err
// }
// otoCtx, readyChan, err := oto.NewContext(decoder.SampleRate(), 2, 2)
// if err != nil {
// t.SoundLock.Release()
// return err
// }
// <-readyChan
// player := otoCtx.NewPlayer(decoder)
// player.Play()
// for player.IsPlaying() {
// if t.SoundLock.Stop {
// t.SoundLock.Release()
// return nil
// } else {
// time.Sleep(time.Millisecond)
// }
// }
// if err = player.Close(); err != nil {
// t.SoundLock.Release()
// return err
// }
//
name, ok := voiceName[lang]
if !ok {
return errors.New(t.EngineName + " does not support text to speech of " + lang)
}
urlStr := fmt.Sprintf(
ttsURL,
name,
base64.StdEncoding.EncodeToString([]byte(message)),
)
req, _ := http.NewRequest("GET", urlStr, nil)
req.Header.Add("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36")
res, err := http.DefaultClient.Do(req)
if err != nil {
t.SoundLock.Release()
return err
}
decoder, err := mp3.NewDecoder(res.Body)
if err != nil {
t.SoundLock.Release()
return err
}
otoCtx, readyChan, err := oto.NewContext(decoder.SampleRate(), 2, 2)
if err != nil {
t.SoundLock.Release()
return err
}
<-readyChan
player := otoCtx.NewPlayer(decoder)
player.Play()
for player.IsPlaying() {
if t.SoundLock.Stop {
t.SoundLock.Release()
return nil
} else {
time.Sleep(time.Millisecond)
}
}
if err = player.Close(); err != nil {
t.SoundLock.Release()
return err
}
t.SoundLock.Release()
return nil
}