package service import ( "bytes" "cloud.google.com/go/texttospeech/apiv1" "crypto/md5" "fmt" "git.links123.net/Slate/CorpusAI/config" "github.com/aliyun/aliyun-oss-go-sdk/oss" texttospeechpb "google.golang.org/genproto/googleapis/cloud/texttospeech/v1" "golang.org/x/net/context" ) // @Description Get TTS Oss unique key func GetTtsOssKey(Text string, VoiceName string, LanguageCode string, Speed float64, Pitch float64) string { data := []byte(Text) hash := md5.Sum(data) md5Value := fmt.Sprintf("%x", hash) key := fmt.Sprintf("%s/%s/%s/%s/%f_%f.mp3", "tts/en/google", md5Value, LanguageCode, VoiceName, Speed, Pitch) return key } func GetUrl(ossObjectKey string) string { ossConfig := config.C.OSS appConfig := config.C.App if appConfig.InChina == true { return fmt.Sprintf("https://%s.%s/%s", ossConfig.Bucket, ossConfig.EndPoint, ossObjectKey) } else { return fmt.Sprintf("https://%s.%s/%s", ossConfig.HkBucket, ossConfig.HkEndPoint, ossObjectKey) } } // @Description Upload AudioContent to Oss func UploadOss(ossObjectKey string, AudioContent []byte) (bool , error) { ossConfig := config.C.OSS client, err := oss.New(ossConfig.EndPoint, ossConfig.AccessKey, ossConfig.SecretKey) bucket, err := client.Bucket(ossConfig.Bucket) if err != nil { return false, fmt.Errorf("texttospeech.UploadOss Bucket error: %v", err) } // 上传Byte数组。 err = bucket.PutObject(ossObjectKey, bytes.NewReader(AudioContent)) isExist, err := bucket.IsObjectExist(ossObjectKey) if err != nil { return false, fmt.Errorf("texttospeech.UploadOss Put error: %v", err) } return isExist, nil } func UploadHkOss(ossObjectKey string, AudioContent []byte) (bool , error) { ossConfig := config.C.OSS client, err := oss.New(ossConfig.HkEndPoint, ossConfig.AccessKey, ossConfig.SecretKey) bucket, err := client.Bucket(ossConfig.HkBucket) if err != nil { return false, fmt.Errorf("texttospeech.UploadOss Bucket error: %v", err) } // 上传Byte数组。 err = bucket.PutObject(ossObjectKey, bytes.NewReader(AudioContent)) isExist, err := bucket.IsObjectExist(ossObjectKey) if err != nil { return false, fmt.Errorf("texttospeech.UploadOss Put error: %v", err) } return isExist, nil } // @Description Text to speech func TextToSpeech(Text string, VoiceName string, LanguageCode string, Speed float64, Pitch float64) ([]byte , error) { ctx := context.Background() client, err := texttospeech.NewClient(ctx) if err != nil { return nil, fmt.Errorf("texttospeech.NewClient error: %v", err) } req := texttospeechpb.SynthesizeSpeechRequest{ // Set the text input to be synthesized. Input: &texttospeechpb.SynthesisInput{ InputSource: &texttospeechpb.SynthesisInput_Text{Text: Text}, }, // Build the voice request, select the language code ("en-US") and the SSML // voice gender ("neutral"). Voice: &texttospeechpb.VoiceSelectionParams{ Name: VoiceName, LanguageCode: LanguageCode, //SsmlGender: texttospeechpb.SsmlVoiceGender_NEUTRAL, }, // Select the type of audio file you want returned. AudioConfig: &texttospeechpb.AudioConfig{ AudioEncoding: texttospeechpb.AudioEncoding_MP3, SpeakingRate: Speed, Pitch: Pitch, }, } resp, err := client.SynthesizeSpeech(ctx, &req) if err != nil { return nil, fmt.Errorf("texttospeech.SynthesizeSpeech error: %v", err) } return resp.AudioContent, nil }