From b3f41357321a33f36db8f71398f76c618653c590 Mon Sep 17 00:00:00 2001 From: eeeXun Date: Sat, 10 Aug 2024 14:37:44 +0800 Subject: [PATCH] refactor: move play tts to core --- internal/translate/apertium/translator.go | 4 +- internal/translate/argos/translator.go | 4 +- internal/translate/bing/translator.go | 26 ++------- internal/translate/chatgpt/translator.go | 4 +- internal/translate/core/lock.go | 35 ------------- internal/translate/core/tts.go | 64 +++++++++++++++++++++++ internal/translate/deepl/translator.go | 4 +- internal/translate/deeplx/translator.go | 4 +- internal/translate/google/translator.go | 26 ++------- internal/translate/reverso/translator.go | 26 ++------- 10 files changed, 83 insertions(+), 114 deletions(-) delete mode 100644 internal/translate/core/lock.go create mode 100644 internal/translate/core/tts.go diff --git a/internal/translate/apertium/translator.go b/internal/translate/apertium/translator.go index 5c64e61..cd345d7 100644 --- a/internal/translate/apertium/translator.go +++ b/internal/translate/apertium/translator.go @@ -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"), } } diff --git a/internal/translate/argos/translator.go b/internal/translate/argos/translator.go index 322ff10..b458a92 100644 --- a/internal/translate/argos/translator.go +++ b/internal/translate/argos/translator.go @@ -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"), } } diff --git a/internal/translate/bing/translator.go b/internal/translate/bing/translator.go index 670821e..a7417f7 100644 --- a/internal/translate/bing/translator.go +++ b/internal/translate/bing/translator.go @@ -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) } diff --git a/internal/translate/chatgpt/translator.go b/internal/translate/chatgpt/translator.go index 600efc9..478c6a3 100644 --- a/internal/translate/chatgpt/translator.go +++ b/internal/translate/chatgpt/translator.go @@ -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"), } } diff --git a/internal/translate/core/lock.go b/internal/translate/core/lock.go deleted file mode 100644 index 3b5aca0..0000000 --- a/internal/translate/core/lock.go +++ /dev/null @@ -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 -} diff --git a/internal/translate/core/tts.go b/internal/translate/core/tts.go new file mode 100644 index 0000000..5d6513e --- /dev/null +++ b/internal/translate/core/tts.go @@ -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() +} diff --git a/internal/translate/deepl/translator.go b/internal/translate/deepl/translator.go index e0aa8c5..6df2de9 100644 --- a/internal/translate/deepl/translator.go +++ b/internal/translate/deepl/translator.go @@ -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"), } } diff --git a/internal/translate/deeplx/translator.go b/internal/translate/deeplx/translator.go index 5962e27..b1022dc 100644 --- a/internal/translate/deeplx/translator.go +++ b/internal/translate/deeplx/translator.go @@ -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"), } } diff --git a/internal/translate/google/translator.go b/internal/translate/google/translator.go index 79df9ab..06f0d11 100644 --- a/internal/translate/google/translator.go +++ b/internal/translate/google/translator.go @@ -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) } diff --git a/internal/translate/reverso/translator.go b/internal/translate/reverso/translator.go index d2c94ca..272c162 100644 --- a/internal/translate/reverso/translator.go +++ b/internal/translate/reverso/translator.go @@ -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) }