Text to Speech Speech to Text

job.go 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. "net/url"
  12. "strconv"
  13. "strings"
  14. )
  15. type TtsRaw struct {
  16. ID int64
  17. Text string //翻译的文本
  18. UniqKey string //唯一键值
  19. Status int64
  20. Remark string
  21. }
  22. func (TtsRaw) TableName() string {
  23. return "lnk_corpus_tts_raw"
  24. }
  25. type langType struct {
  26. languageCode string;
  27. voiceName string;
  28. }
  29. func RunCommand() *cobra.Command {
  30. cmd := &cobra.Command{
  31. Use: "job",
  32. Short: "Run the job service",
  33. Run: func(cmd *cobra.Command, args []string) {
  34. //fmt.Println("Echo: " + strings.Join(args, " "))
  35. minId := args[0]
  36. maxId := args[1]
  37. dbConfig := config.C.DB
  38. settings := dbConfig.User+":"+dbConfig.Password+"@tcp("+dbConfig.Host+")/"+dbConfig.Name+"?charset=utf8&parseTime=True&loc=Local"
  39. var ttsRawList []TtsRaw
  40. db, err := gorm.Open("mysql", settings)
  41. if err != nil {
  42. panic("failed to connect database")
  43. }
  44. speed, _ := strconv.ParseFloat( "1.00", 64)
  45. pitch, _ := strconv.ParseFloat( "0.00", 64)
  46. db.Where("id <= ? and id >= ?", maxId, minId).Find(&ttsRawList)
  47. for _, ttsRaw := range ttsRawList {
  48. result, msg := SyncTtsOss(ttsRaw.Text, speed, pitch)
  49. if result == true {
  50. ttsRaw.Status = 1
  51. //更新成功
  52. } else {
  53. ttsRaw.Status = -1
  54. //更新错误状态和msg
  55. ttsRaw.Remark = msg
  56. }
  57. fmt.Println(ttsRaw)
  58. db.Save(&ttsRaw)
  59. }
  60. db.Close()
  61. },
  62. }
  63. return cmd
  64. }
  65. func SyncTtsOss(text string, speed float64, pitch float64) (bool, string) {
  66. text, _ = url.QueryUnescape(text)
  67. text = strings.Trim(text , "")
  68. if text == "" {
  69. return false, "Error: text null"
  70. }
  71. typeMap := make(map[int]langType)
  72. typeMap[1] = langType{"en-US","en-US-Wavenet-B"}
  73. typeMap[2] = langType{"en-US","en-US-Wavenet-C"}
  74. typeMap[3] = langType{"en-GB","en-GB-Wavenet-B"}
  75. typeMap[4] = langType{"en-GB","en-GB-Wavenet-C"}
  76. for _, lang := range typeMap {
  77. ossObjectKey := service.GetTtsOssKey(text, lang.voiceName, lang.languageCode, speed, pitch)
  78. textKey := cache.GetTextKey(ossObjectKey)
  79. AudioContent, err := service.TextToSpeech(text, lang.voiceName, lang.languageCode, speed, pitch)
  80. if err != nil {
  81. return false, "TextToSpeech Error:" + err.Error()
  82. }
  83. uploadResult, err := service.UploadHkOss(ossObjectKey, AudioContent)
  84. if uploadResult == true {
  85. uploadResult, err = service.UploadOss(ossObjectKey, AudioContent)
  86. if uploadResult == true {
  87. //hk&cn节点oss都同步成功, set db
  88. mysql.CreateCorpusTts(text, textKey, lang.languageCode, lang.voiceName, ossObjectKey, speed, pitch)
  89. }
  90. }
  91. if err != nil {
  92. return false, "UploadHkOss Error" + err.Error()
  93. }
  94. }
  95. return true, ""
  96. }