Text to Speech Speech to Text

text_to_speech.go 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package service
  2. import (
  3. "bytes"
  4. "cloud.google.com/go/texttospeech/apiv1"
  5. "crypto/md5"
  6. "fmt"
  7. "git.links123.net/Slate/CorpusAI/config"
  8. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  9. texttospeechpb "google.golang.org/genproto/googleapis/cloud/texttospeech/v1"
  10. "golang.org/x/net/context"
  11. )
  12. // @Description Get TTS Oss unique key
  13. func GetTtsOssKey(Text string, VoiceName string, LanguageCode string, Speed float64, Pitch float64) string {
  14. data := []byte(Text)
  15. hash := md5.Sum(data)
  16. md5Value := fmt.Sprintf("%x", hash)
  17. key := fmt.Sprintf("%s/%s/%s/%s/%f_%f.mp3", "tts/en/google", md5Value, LanguageCode, VoiceName, Speed, Pitch)
  18. return key
  19. }
  20. func GetUrl(ossObjectKey string) string {
  21. ossConfig := config.C.OSS
  22. appConfig := config.C.App
  23. if appConfig.InChina == true {
  24. return fmt.Sprintf("https://%s.%s/%s", ossConfig.Bucket, ossConfig.EndPoint, ossObjectKey)
  25. } else {
  26. return fmt.Sprintf("https://%s.%s/%s", ossConfig.HkBucket, ossConfig.HkEndPoint, ossObjectKey)
  27. }
  28. }
  29. // @Description Upload AudioContent to Oss
  30. func UploadOss(ossObjectKey string, AudioContent []byte) (bool , error) {
  31. ossConfig := config.C.OSS
  32. client, err := oss.New(ossConfig.EndPoint, ossConfig.AccessKey, ossConfig.SecretKey)
  33. bucket, err := client.Bucket(ossConfig.Bucket)
  34. if err != nil {
  35. return false, fmt.Errorf("texttospeech.UploadOss Bucket error: %v", err)
  36. }
  37. // 上传Byte数组。
  38. err = bucket.PutObject(ossObjectKey, bytes.NewReader(AudioContent))
  39. isExist, err := bucket.IsObjectExist(ossObjectKey)
  40. if err != nil {
  41. return false, fmt.Errorf("texttospeech.UploadOss Put error: %v", err)
  42. }
  43. return isExist, nil
  44. }
  45. func UploadHkOss(ossObjectKey string, AudioContent []byte) (bool , error) {
  46. ossConfig := config.C.OSS
  47. client, err := oss.New(ossConfig.HkEndPoint, ossConfig.AccessKey, ossConfig.SecretKey)
  48. bucket, err := client.Bucket(ossConfig.HkBucket)
  49. if err != nil {
  50. return false, fmt.Errorf("texttospeech.UploadOss Bucket error: %v", err)
  51. }
  52. // 上传Byte数组。
  53. err = bucket.PutObject(ossObjectKey, bytes.NewReader(AudioContent))
  54. isExist, err := bucket.IsObjectExist(ossObjectKey)
  55. if err != nil {
  56. return false, fmt.Errorf("texttospeech.UploadOss Put error: %v", err)
  57. }
  58. return isExist, nil
  59. }
  60. // @Description Text to speech
  61. func TextToSpeech(Text string, VoiceName string, LanguageCode string, Speed float64, Pitch float64) ([]byte , error) {
  62. ctx := context.Background()
  63. client, err := texttospeech.NewClient(ctx)
  64. if err != nil {
  65. return nil, fmt.Errorf("texttospeech.NewClient error: %v", err)
  66. }
  67. req := texttospeechpb.SynthesizeSpeechRequest{
  68. // Set the text input to be synthesized.
  69. Input: &texttospeechpb.SynthesisInput{
  70. InputSource: &texttospeechpb.SynthesisInput_Text{Text: Text},
  71. },
  72. // Build the voice request, select the language code ("en-US") and the SSML
  73. // voice gender ("neutral").
  74. Voice: &texttospeechpb.VoiceSelectionParams{
  75. Name: VoiceName,
  76. LanguageCode: LanguageCode,
  77. //SsmlGender: texttospeechpb.SsmlVoiceGender_NEUTRAL,
  78. },
  79. // Select the type of audio file you want returned.
  80. AudioConfig: &texttospeechpb.AudioConfig{
  81. AudioEncoding: texttospeechpb.AudioEncoding_MP3,
  82. SpeakingRate: Speed,
  83. Pitch: Pitch,
  84. },
  85. }
  86. resp, err := client.SynthesizeSpeech(ctx, &req)
  87. if err != nil {
  88. return nil, fmt.Errorf("texttospeech.SynthesizeSpeech error: %v", err)
  89. }
  90. return resp.AudioContent, nil
  91. }