Skip to content

Commit

Permalink
refactor: move play tts to core
Browse files Browse the repository at this point in the history
  • Loading branch information
eeeXun committed Aug 10, 2024
1 parent e2cb8cf commit b3f4135
Show file tree
Hide file tree
Showing 10 changed files with 83 additions and 114 deletions.
4 changes: 2 additions & 2 deletions internal/translate/apertium/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}

func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("Apertium"),
}
}
Expand Down
4 changes: 2 additions & 2 deletions internal/translate/argos/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}

func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("Argos"),
}
}
Expand Down
26 changes: 3 additions & 23 deletions internal/translate/bing/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand All @@ -27,7 +24,7 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}

Expand All @@ -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"),
}
}
Expand Down Expand Up @@ -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)
}
4 changes: 2 additions & 2 deletions internal/translate/chatgpt/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}

func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("ChatGPT"),
}
}
Expand Down
35 changes: 0 additions & 35 deletions internal/translate/core/lock.go

This file was deleted.

64 changes: 64 additions & 0 deletions internal/translate/core/tts.go
Original file line number Diff line number Diff line change
@@ -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()
}
4 changes: 2 additions & 2 deletions internal/translate/deepl/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}

func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("DeepL"),
}
}
Expand Down
4 changes: 2 additions & 2 deletions internal/translate/deeplx/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ import (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}

func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("DeepLX"),
}
}
Expand Down
26 changes: 3 additions & 23 deletions internal/translate/google/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand All @@ -22,15 +19,15 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}

func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("Google"),
}
}
Expand Down Expand Up @@ -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)
}
26 changes: 3 additions & 23 deletions internal/translate/reverso/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand All @@ -24,15 +21,15 @@ const (
type Translator struct {
*core.Server
*core.Language
*core.TTSLock
*core.TTS
core.EngineName
}

func NewTranslator() *Translator {
return &Translator{
Server: new(core.Server),
Language: new(core.Language),
TTSLock: core.NewTTSLock(),
TTS: core.NewTTS(),
EngineName: core.NewEngineName("Reverso"),
}
}
Expand Down Expand Up @@ -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)
}

0 comments on commit b3f4135

Please sign in to comment.