From 2d65f11b3bbe029dcb4cf81e81e4f2d5777a8261 Mon Sep 17 00:00:00 2001 From: Junv Zhao Date: Tue, 27 Jun 2017 11:11:25 +0800 Subject: [PATCH] Add ability to read the words under Mac OS --- main.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 4933cce..ae8d3e7 100644 --- a/main.go +++ b/main.go @@ -2,15 +2,29 @@ package main import ( "fmt" + "io" "os" + "os/exec" + "strconv" + "time" + + "net/http" + "net/url" + + log "github.com/Sirupsen/logrus" "github.com/urfave/cli" ) +const ( + Mp3FileName = "say-it.mp3" +) + var ( person int speed int pitch int + token string = "24.85efc4bbd8b8315255dcb59cd82e1ac4.2592000.1501048297.282335-9739014" ) func main() { @@ -26,8 +40,7 @@ func main() { return nil } words := c.Args().Get(0) - fmt.Println(words) - + fetchVoiceAndSpeak(words) fmt.Println(person, speed, pitch) return nil } @@ -57,3 +70,47 @@ func setFlags(app *cli.App) { }, } } + +func fetchVoiceAndSpeak(text string) { + urlObject := buildURL(text) + response, err := http.Get(urlObject.String()) + + if err != nil { + log.Error("Fetch voice failed:" + err.Error()) + } + // fmt.Println(response.StatusCode) + + defer response.Body.Close() + out, err := os.Create(Mp3FileName) + if err != nil { + log.Fatal("Create file failed:" + err.Error()) + } + defer out.Close() + io.Copy(out, response.Body) + + speak() +} + +func speak() { + command := exec.Command("afplay", Mp3FileName) + if err := command.Run(); err != nil { + log.Error("Failed to say the words: " + err.Error()) + } +} + +func buildURL(text string) *url.URL { + baseURL := "http://tsn.baidu.com/text2audio" + urlObject, _ := url.Parse(baseURL) + + queries := url.Values{} + queries.Add("tex", text) + queries.Add("lan", "zh") + queries.Add("cuid", strconv.FormatInt(time.Now().Unix(), 10)) + queries.Add("ctp", "1") + queries.Add("tok", token) + queries.Add("per", strconv.Itoa(person)) + queries.Add("spd", strconv.Itoa(speed)) + queries.Add("pit", strconv.Itoa(pitch)) + urlObject.RawQuery = queries.Encode() + return urlObject +}