69 lines
1.4 KiB
Go
69 lines
1.4 KiB
Go
//go:build extra
|
|
// +build extra
|
|
|
|
package extra
|
|
|
|
import (
|
|
"gf-lt/config"
|
|
"gf-lt/models"
|
|
"log/slog"
|
|
"os"
|
|
"strings"
|
|
|
|
google_translate_tts "github.com/GrailFinder/google-translate-tts"
|
|
)
|
|
|
|
var (
|
|
TTSTextChan = make(chan string, 10000)
|
|
TTSFlushChan = make(chan bool, 1)
|
|
TTSDoneChan = make(chan bool, 1)
|
|
// endsWithPunctuation = regexp.MustCompile(`[;.!?]$`)
|
|
)
|
|
|
|
type Orator interface {
|
|
Speak(text string) error
|
|
Stop()
|
|
// pause and resume?
|
|
GetLogger() *slog.Logger
|
|
}
|
|
|
|
func NewOrator(log *slog.Logger, cfg *config.Config) Orator {
|
|
provider := cfg.TTS_PROVIDER
|
|
if provider == "" {
|
|
provider = "google" // does not require local setup
|
|
}
|
|
switch strings.ToLower(provider) {
|
|
case "kokoro": // kokoro
|
|
orator := &KokoroOrator{
|
|
logger: log,
|
|
URL: cfg.TTS_URL,
|
|
Format: models.AFMP3,
|
|
Stream: false,
|
|
Speed: cfg.TTS_SPEED,
|
|
Language: "a",
|
|
Voice: "af_bella(1)+af_sky(1)",
|
|
}
|
|
go orator.readroutine()
|
|
go orator.stoproutine()
|
|
return orator
|
|
default:
|
|
language := cfg.TTS_LANGUAGE
|
|
if language == "" {
|
|
language = "en"
|
|
}
|
|
speech := &google_translate_tts.Speech{
|
|
Folder: os.TempDir() + "/gf-lt-tts", // Temporary directory for caching
|
|
Language: language,
|
|
Proxy: "", // Proxy not supported
|
|
Speed: cfg.TTS_SPEED,
|
|
}
|
|
orator := &GoogleTranslateOrator{
|
|
logger: log,
|
|
speech: speech,
|
|
}
|
|
go orator.readroutine()
|
|
go orator.stoproutine()
|
|
return orator
|
|
}
|
|
}
|