v/GTT
1
0
mirror of https://github.com/eeeXun/GTT.git synced 2025-05-16 07:40:44 -07:00

refactor: move play tts to core

This commit is contained in:
eeeXun 2024-08-10 14:37:44 +08:00
parent e2cb8cfaf0
commit b3f4135732
10 changed files with 83 additions and 114 deletions

View File

@ -18,7 +18,7 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}
@ -26,7 +26,7 @@ func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("Apertium"),
}
}

View File

@ -17,7 +17,7 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}
@ -25,7 +25,7 @@ func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("Argos"),
}
}

View File

@ -9,11 +9,8 @@ import (
"net/url"
"regexp"
"strings"
"time"
"github.com/eeeXun/gtt/internal/translate/core"
"github.com/hajimehoshi/go-mp3"
"github.com/hajimehoshi/oto/v2"
)
const (
@ -27,7 +24,7 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}
@ -42,7 +39,7 @@ func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("Bing"),
}
}
@ -192,22 +189,5 @@ func (t *Translator) PlayTTS(lang, message string) error {
if err != nil {
return err
}
decoder, err := mp3.NewDecoder(res.Body)
if err != nil {
return err
}
otoCtx, readyChan, err := oto.NewContext(decoder.SampleRate(), 2, 2)
if err != nil {
return err
}
<-readyChan
player := otoCtx.NewPlayer(decoder)
player.Play()
for player.IsPlaying() {
if t.IsStopped() {
return player.Close()
}
time.Sleep(time.Millisecond)
}
return player.Close()
return t.Play(res.Body)
}

View File

@ -18,7 +18,7 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}
@ -26,7 +26,7 @@ func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("ChatGPT"),
}
}

View File

@ -1,35 +0,0 @@
package core
type TTSLock struct {
using bool
stop bool
}
func NewTTSLock() *TTSLock {
return &TTSLock{
stop: true,
using: false,
}
}
func (l *TTSLock) LockAvailable() bool {
return l.stop && !l.using
}
func (l *TTSLock) AcquireLock() {
l.stop = false
l.using = true
}
func (l *TTSLock) IsStopped() bool {
return l.stop
}
func (l *TTSLock) StopTTS() {
l.stop = true
}
func (l *TTSLock) ReleaseLock() {
l.stop = true
l.using = false
}

View File

@ -0,0 +1,64 @@
package core
import (
"io"
"time"
"github.com/hajimehoshi/go-mp3"
"github.com/hajimehoshi/oto/v2"
)
type TTS struct {
stop bool
using bool
}
func NewTTS() *TTS {
return &TTS{
stop: true,
using: false,
}
}
func (s *TTS) LockAvailable() bool {
return s.stop && !s.using
}
func (s *TTS) AcquireLock() {
s.stop = false
s.using = true
}
func (s *TTS) IsStopped() bool {
return s.stop
}
func (s *TTS) StopTTS() {
s.stop = true
}
func (s *TTS) ReleaseLock() {
s.stop = true
s.using = false
}
func (s *TTS) Play(body io.Reader) error {
decoder, err := mp3.NewDecoder(body)
if err != nil {
return err
}
otoCtx, readyChan, err := oto.NewContext(decoder.SampleRate(), 2, 2)
if err != nil {
return err
}
<-readyChan
player := otoCtx.NewPlayer(decoder)
player.Play()
for player.IsPlaying() {
if s.IsStopped() {
return player.Close()
}
time.Sleep(time.Millisecond)
}
return player.Close()
}

View File

@ -18,7 +18,7 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}
@ -26,7 +26,7 @@ func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("DeepL"),
}
}

View File

@ -13,7 +13,7 @@ import (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}
@ -21,7 +21,7 @@ func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("DeepLX"),
}
}

View File

@ -7,11 +7,8 @@ import (
"io"
"net/http"
"net/url"
"time"
"github.com/eeeXun/gtt/internal/translate/core"
"github.com/hajimehoshi/go-mp3"
"github.com/hajimehoshi/oto/v2"
)
const (
@ -22,7 +19,7 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}
@ -30,7 +27,7 @@ func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("Google"),
}
}
@ -135,22 +132,5 @@ func (t *Translator) PlayTTS(lang, message string) error {
if res.StatusCode == 400 {
return errors.New(t.GetEngineName() + " does not support text to speech of " + lang)
}
decoder, err := mp3.NewDecoder(res.Body)
if err != nil {
return err
}
otoCtx, readyChan, err := oto.NewContext(decoder.SampleRate(), 2, 2)
if err != nil {
return err
}
<-readyChan
player := otoCtx.NewPlayer(decoder)
player.Play()
for player.IsPlaying() {
if t.IsStopped() {
return player.Close()
}
time.Sleep(time.Millisecond)
}
return player.Close()
return t.Play(res.Body)
}

View File

@ -9,11 +9,8 @@ import (
"io"
"net/http"
"regexp"
"time"
"github.com/eeeXun/gtt/internal/translate/core"
"github.com/hajimehoshi/go-mp3"
"github.com/hajimehoshi/oto/v2"
)
const (
@ -24,7 +21,7 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}
@ -32,7 +29,7 @@ func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("Reverso"),
}
}
@ -131,22 +128,5 @@ func (t *Translator) PlayTTS(lang, message string) error {
if err != nil {
return err
}
decoder, err := mp3.NewDecoder(res.Body)
if err != nil {
return err
}
otoCtx, readyChan, err := oto.NewContext(decoder.SampleRate(), 2, 2)
if err != nil {
return err
}
<-readyChan
player := otoCtx.NewPlayer(decoder)
player.Play()
for player.IsPlaying() {
if t.IsStopped() {
return player.Close()
}
time.Sleep(time.Millisecond)
}
return player.Close()
return t.Play(res.Body)
}