forked from yihong0618/xiaogpt
-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathedge_tts.go
72 lines (60 loc) · 1.65 KB
/
edge_tts.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package xiaobot
import (
"fmt"
"log"
"math/rand"
"net/http"
"os"
"path/filepath"
"time"
"github.com/longbai/edgetts"
)
func (mt *MiBot) startEdgeServer() {
mt.tempDir, _ = os.MkdirTemp("", "xiaogpt-tts-")
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, filepath.Join(mt.tempDir, filepath.Base(r.URL.Path)))
})
mt.hostname = getHostname()
rd := rand.Uint32() % 50
mt.port = int(8000 + rd)
err := http.ListenAndServe(fmt.Sprintf("%s:%d", mt.hostname, mt.port), nil)
if err != nil {
fmt.Printf("Error starting HTTP server: %v\n", err)
}
fmt.Printf("Serving on %s:%d\n", mt.hostname, mt.port)
}
const voiceFormat = "audio-24khz-48kbitrate-mono-mp3"
func (mt *MiBot) textToMp3(text string, ttsLang string) (string, error) {
ttsEdge := edgetts.EdgeTTS{}
ssml := edgetts.CreateSSML(text, ttsLang)
log.Println(ssml)
b, err := ttsEdge.GetAudio(ssml, voiceFormat)
if err != nil {
log.Printf("Error: %v\n", err)
return "", err
}
filename := fmt.Sprintf("%s.mp3", time.Now().Format("20060102150405"))
fp := filepath.Join(mt.tempDir, filename)
err = os.WriteFile(fp, b, 0644)
if err != nil {
log.Printf("Error: %v\n", err)
return "", err
}
return filename, nil
}
func (mt *MiBot) edgeTTS(text string, ttsLang string) error {
filename, err := mt.textToMp3(text, ttsLang)
if err != nil {
return err
}
u := fmt.Sprintf("http://%s:%d/%s", mt.hostname, mt.port, filename)
fmt.Printf("play: %s\n", u)
v, err := mt.minaService.PlayByUrl(mt.deviceID, u)
log.Printf("play url %v, Error: %v\n", v, err)
if err != nil {
return err
}
time.Sleep(calculateTtsElapse(text))
mt.waitForTTSFinish()
return nil
}