微软文本转语音实测记录

微软文本语音

微软文本转语音实测记录插图

接口地址

地址:http://www.mysqlschool.cn/SpeekText/index.php

提交方式:post/get  推荐post

单段落例子:http://www.mysqlschool.cn/SpeekText/index.php

多段落例子:http://www.mysqlschool.cn/SpeekText/SpeekText.html

生成失败无需刷新页面重新点击生成语音即可

微软文本转语音实测记录插图1

参数讲解

微软文本转语音实测记录插图2

voice_name 可选项

zh-CN-XiaoxiaoNeural > Xiaoxiao (Neural) - 晓晓 

zh-CN-YunyangNeural > Yunyang (Neural) - 云扬 

zh-CN-XiaochenNeural > Xiaochen (Neural) - 晓辰

zh-CN-XiaohanNeural > Xiaohan (Neural) - 晓涵

zh-CN-XiaomoNeural > Xiaomo (Neural) - 晓墨

zh-CN-XiaoqiuNeural > Xiaoqiu (Neural) - 晓秋

zh-CN-XiaoruiNeural > Xiaorui (Neural) - 晓睿

zh-CN-XiaoshuangNeural > Xiaoshuang (Neural) - 晓双

zh-CN-XiaoxuanNeural > Xiaoxuan (Neural) - 晓萱

zh-CN-XiaoyanNeural > Xiaoyan (Neural) - 晓颜

zh-CN-XiaoyouNeural > Xiaoyou (Neural) - 晓悠

zh-CN-YunxiNeural > Yunxi (Neural) - 云希

zh-CN-YunyeNeural > Yunye (Neural) - 云野

role 可选项

角色 说明
role="Girl" 该语音模拟女孩。
role="Boy" 该语音模拟男孩。
role="YoungAdultFemale" 该语音模拟年轻成年女性。
role="YoungAdultMale" 该语音模拟年轻成年男性。
role="OlderAdultFemale" 该语音模拟年长的成年女性。
role="OlderAdultMale" 该语音模拟年长的成年男性。
role="SeniorFemale" 该语音模拟老年女性。
role="SeniorMale" 该语音模拟老年男性。

Style 可选项

Style 说明
style="affectionate" 以较高的音调和音量表达温暖而亲切的语气。 说话者处于吸引听众注意力的状态。 说话者的个性往往是讨喜的。
style="angry" 表达生气和厌恶的语气。
style="assistant" 以热情而轻松的语气对数字助理讲话。
style="calm" 以沉着冷静的态度说话。 语气、音调和韵律与其他语音类型相比要统一得多。
style="chat" 表达轻松随意的语气。
style="cheerful" 表达积极愉快的语气。
style="customerservice" 以友好热情的语气为客户提供支持。
style="depressed" 调低音调和音量来表达忧郁、沮丧的语气。
style="disgruntled" 表达轻蔑和抱怨的语气。 这种情绪的语音表现出不悦和蔑视。
style="embarrassed" 在说话者感到不舒适时表达不确定、犹豫的语气。
style="empathetic" 表达关心和理解。
style="envious" 当你渴望别人拥有的东西时,表达一种钦佩的语气。
style="fearful" 以较高的音调、较高的音量和较快的语速来表达恐惧、紧张的语气。 说话人处于紧张和不安的状态。
style="gentle" 以较低的音调和音量表达温和、礼貌和愉快的语气。
style="lyrical" 以优美又带感伤的方式表达情感。
style="narration-professional" 以专业、客观的语气朗读内容。
style="narration-relaxed" 为内容阅读表达一种舒缓而悦耳的语气。
style="newscast" 以正式专业的语气叙述新闻。
style="newscast-casual" 以通用、随意的语气发布一般新闻。
style="newscast-formal" 以正式、自信和权威的语气发布新闻。
style="sad" 表达悲伤语气。
style="serious" 表达严肃和命令的语气。 说话者的声音通常比较僵硬,节奏也不那么轻松。

其他参数请看《通过语音合成标记语言 (SSML) 改善合成

预生成的神经语音

预生成的神经网络声音是从使用 24 khz 采样率的样本创建的。 合成时,所有声音都可以使用其他采样率进行上采样或下采样。

下表列出了每种语言支持的预生成的神经网络声音。

这里只写了中文的各种参数配置,全部配置可看《语音服务的语言和语音支持

自己写的php接口源码

隐藏内容

此处内容需要权限查看

  • 普通用户特权:20积分
  • VIP用户特权:20积分
  • SVIP用户特权:20积分

GO源码

其他语言源码可看《Cognitive-Speech-TTS

package main

import (
	"bytes"
	"io"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"time"
)

// auth token
// var token = ""

func GetToken(auth string, key string) string {
	postData := []byte("")

	req, err := http.NewRequest("POST", auth, bytes.NewBuffer(postData))
	if err != nil {
		log.Printf("New request with error %s\n", err)
	}

	token := ""
	req.Header.Set("Ocp-Apim-Subscription-Key", key)
	response, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Printf("Do request failed with error %s\n", err)
	} else {
		defer response.Body.Close()
		data, _ := ioutil.ReadAll(response.Body)
		token = string(data)
		log.Println("token is", token)
	}

	return token
}

func GetAudioBytes(client *http.Client, endpoint string, authToken string, ssml string) {
	start := time.Now()
	postData := []byte(ssml)
	req, err := http.NewRequest("POST", endpoint, bytes.NewBuffer(postData))
	if err != nil {
		log.Printf("New request with error %s\n", err)
		return
	}

	req.Header.Set("content-type", "application/ssml+xml")
	req.Header.Set("X-Microsoft-OutputFormat", "riff-24khz-16bit-mono-pcm")
	req.Header.Set("Authorization", "Bearer "+authToken)
	req.Header.Set("User-Agent", "GoClient")
	response, err := client.Do(req)
	if err != nil {
		log.Printf("Do request failed with error %s\n", err)
	} else {
		defer response.Body.Close()
		if response.StatusCode == 200 {
			data, _ := ioutil.ReadAll(response.Body)
			log.Println("audio byte len is", len(data))
			ioutil.WriteFile("output.mp3", data, 0644)
		} else {
			log.Println("status code is", response.StatusCode)
		}
	}

	elapsed := time.Since(start)
	log.Printf("GetAudioBytes took %s", elapsed)
}

func main() {

	f, err := os.OpenFile("run.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		log.Fatalf("error opening file: %v", err)
		return
	}
	defer f.Close()
	wrt := io.MultiWriter(os.Stdout, f)
	log.SetOutput(wrt)
	log.Println("Starting the application...")

	endpoint := "https://注册时写的位置.tts.speech.microsoft.com/cognitiveservices/v1"
	auth := "https://注册时写的位置.api.cognitive.microsoft.com/sts/v1.0/issueToken"
	key := "你的key"

	token := GetToken(auth, key)
	ticker := time.NewTicker(300 * time.Second)
	go func() {
		for range ticker.C {
			log.Println("Refreshing token")
			t := GetToken(auth, key)
			if len(t) != 0 {
				token = t
			}
		}
	}()

	tr := &http.Transport{
		MaxIdleConns:        100,
		MaxIdleConnsPerHost: 20,
	}

	client := &http.Client{
		Transport: tr,
	}

	GetAudioBytes(client, endpoint, token, "<speak version='1.0' xml:lang='zh-CN'><voice name='zh-CN-YunyeNeural'>哈哈哈,终于成功了!</voice></speak>")

}

 

发表评论

后才能评论