Text to Speech Speech to Text

job.go 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package job
  2. import (
  3. "fmt"
  4. "git.links123.net/Slate/CorpusAI/service"
  5. "git.links123.net/Slate/CorpusAI/service/store/cache"
  6. "git.links123.net/Slate/CorpusAI/service/store/mysql"
  7. "git.links123.net/Slate/CorpusAI/config"
  8. "github.com/jinzhu/gorm"
  9. _ "github.com/go-sql-driver/mysql"
  10. "github.com/spf13/cobra"
  11. "github.com/gocolly/colly"
  12. "net/url"
  13. "strconv"
  14. "strings"
  15. )
  16. type TtsRaw struct {
  17. ID int64
  18. Text string //翻译的文本
  19. UniqKey string //唯一键值
  20. Status int64
  21. Remark string
  22. }
  23. func (TtsRaw) TableName() string {
  24. return "lnk_corpus_tts_raw"
  25. }
  26. type langType struct {
  27. languageCode string;
  28. voiceName string;
  29. }
  30. func RunCommand() *cobra.Command {
  31. cmd := &cobra.Command{
  32. Use: "job",
  33. Short: "Run the job service",
  34. Run: func(cmd *cobra.Command, args []string) {
  35. //fmt.Println("Echo: " + strings.Join(args, " "))
  36. minId := args[0]
  37. maxId := args[1]
  38. dbConfig := config.C.DB
  39. settings := dbConfig.User+":"+dbConfig.Password+"@tcp("+dbConfig.Host+")/"+dbConfig.Name+"?charset=utf8&parseTime=True&loc=Local"
  40. var ttsRawList []TtsRaw
  41. db, err := gorm.Open("mysql", settings)
  42. if err != nil {
  43. panic("failed to connect database")
  44. }
  45. speed, _ := strconv.ParseFloat( "1.00", 64)
  46. pitch, _ := strconv.ParseFloat( "0.00", 64)
  47. db.Where("id <= ? and id >= ?", maxId, minId).Find(&ttsRawList)
  48. for _, ttsRaw := range ttsRawList {
  49. result, msg := SyncTtsOss(ttsRaw.Text, speed, pitch)
  50. if result == true {
  51. ttsRaw.Status = 1
  52. //更新成功
  53. } else {
  54. ttsRaw.Status = -1
  55. //更新错误状态和msg
  56. ttsRaw.Remark = msg
  57. }
  58. fmt.Println(ttsRaw)
  59. db.Save(&ttsRaw)
  60. }
  61. db.Close()
  62. },
  63. }
  64. return cmd
  65. }
  66. func SyncTtsOss(text string, speed float64, pitch float64) (bool, string) {
  67. text, _ = url.QueryUnescape(text)
  68. text = strings.Trim(text , "")
  69. if text == "" {
  70. return false, "Error: text null"
  71. }
  72. typeMap := make(map[int]langType)
  73. typeMap[1] = langType{"en-US","en-US-Wavenet-B"}
  74. typeMap[2] = langType{"en-US","en-US-Wavenet-C"}
  75. typeMap[3] = langType{"en-GB","en-GB-Wavenet-B"}
  76. typeMap[4] = langType{"en-GB","en-GB-Wavenet-C"}
  77. for _, lang := range typeMap {
  78. ossObjectKey := service.GetTtsOssKey(text, lang.voiceName, lang.languageCode, speed, pitch)
  79. textKey := cache.GetTextKey(ossObjectKey)
  80. AudioContent, err := service.TextToSpeech(text, lang.voiceName, lang.languageCode, speed, pitch)
  81. if err != nil {
  82. return false, "TextToSpeech Error:" + err.Error()
  83. }
  84. uploadResult, err := service.UploadHkOss(ossObjectKey, AudioContent)
  85. if uploadResult == true {
  86. uploadResult, err = service.UploadOss(ossObjectKey, AudioContent)
  87. if uploadResult == true {
  88. //hk&cn节点oss都同步成功, set db
  89. mysql.CreateCorpusTts(text, textKey, lang.languageCode, lang.voiceName, ossObjectKey, speed, pitch)
  90. }
  91. }
  92. if err != nil {
  93. return false, "UploadHkOss Error" + err.Error()
  94. }
  95. }
  96. return true, ""
  97. }
  98. func test() {
  99. // Instantiate default collector
  100. c := colly.NewCollector(
  101. // Visit only domains: hackerspaces.org, wiki.hackerspaces.org
  102. colly.AllowedDomains("dict.cn", "m.dict.cn"),
  103. )
  104. // On every a element which has href attribute call callback
  105. c.OnHTML("div[class=sent]", func(e *colly.HTMLElement) {
  106. //link := e.Attr("href")
  107. // Print link
  108. fmt.Printf("Link found: %q -> %s\n", e.Text)
  109. // Visit link found on page
  110. // Only those links are visited which are in AllowedDomains
  111. //c.Visit(e.Request.AbsoluteURL(link))
  112. })
  113. /**
  114. 1. div[class=sent]
  115. 2. 例句 div[class=layout sort]
  116. 3. 词法用法 div[class=section learn]
  117. 4.
  118. */
  119. // Before making a request print "Visiting ..."
  120. c.OnRequest(func(r *colly.Request) {
  121. fmt.Println("Visiting", r.URL.String())
  122. })
  123. // Start scraping on https://hackerspaces.org
  124. c.Visit("http://dict.cn/about")
  125. }
  126. func newTestCmd() *cobra.Command {
  127. cmd := &cobra.Command{
  128. Use: "test",
  129. Short: "Run the test service",
  130. Run: func(cmd *cobra.Command, args []string) {
  131. //fmt.Println("Echo: " + strings.Join(args, " "))
  132. test()
  133. },
  134. }
  135. return cmd
  136. }