微软-文字转语音.语音合成--逆向爬虫实战
温馨提示:这篇文章已超过381天没有更新,请注意相关的内容是否还可用!
gospider 介绍
gospider 是一个golang 爬虫神器,它内置了多种爬虫模块,是golang 爬虫必备的工具包
安装
go get -u gitee.com/baixudong/gospider
gitee地址
https://gitee.com/baixudong/gospider
github地址
https://github.com/baixudong007/gospider
开始文字转语音逆向
通过抓包得到websocket 地址
注意:这个地址中有个X-ConnectionId参数,这个参数写死或者自己生成假的都可以,这个参数不重要
分析文字转语音参数
这里一个发送了三次参数,三个参数中的X-RequestId 值,这个参数写死或者自己生成假的都可以,这个参数不重要
第一个参数
Path: speech.config
X-RequestId: 890341095E354C9D9C99066349BEC419
X-Timestamp: 2023-03-05T11:54:54.557Z
Content-Type: application/json
{"context":{"system":{"name":"SpeechSDK","version":"1.19.0","build":"JavaScript","lang":"JavaScript"},"os":{"platform":"Browser/Win32","name":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.63","version":"5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.63"}}}
第二个参数
Path: synthesis.context
X-RequestId: 890341095E354C9D9C99066349BEC419
X-Timestamp: 2023-03-05T11:54:54.558Z
Content-Type: application/json
{"synthesis":{"audio":{"metadataOptions":{"bookmarkEnabled":false,"sentenceBoundaryEnabled":false,"visemeEnabled":false,"wordBoundaryEnabled":false},"outputFormat":"audio-24khz-96kbitrate-mono-mp3"},"language":{"autoDetection":false}}}
第三个参数
Path: ssml X-RequestId: 890341095E354C9D9C99066349BEC419 X-Timestamp: 2023-03-05T11:54:54.559Z Content-Type: application/ssml+xml 你可将此文本替换为所需的任何文本。你可在此文本框中编写或在此处粘贴你自己的文本。 试用不同的语言和声音。改变语速和音调。你甚至可调整 SSML(语音合成标记语言),以控制文本不同部分的声音效果。单击上面的 SSML 试用一下! 请尽情使用文本转语音功能!
注意: 这三个参数要以text 的形式发送到接口。参数中的值没有难度
gospider 代码实现
package main
import (
"fmt"
"log"
"strings"
"time"
"gitee.com/baixudong/gospider/re"
"gitee.com/baixudong/gospider/requests"
"gitee.com/baixudong/gospider/tools"
"gitee.com/baixudong/gospider/websocket"
"github.com/google/uuid"
)
func createMsg(path, requestId, contentType string, con string) []byte {
txt := fmt.Sprintf("Path: %s\r\nX-RequestId: %s\r\nX-Timestamp: %s\r\nContent-Type: %s\r\n\r\n%s",
path,
requestId,
time.Now().Format("2006-01-02T15:04:05.271Z"),
contentType,
con,
)
return tools.StringToBytes(txt)
}
var quid = strings.ToUpper(re.Sub("-", "", uuid.New().String()))
func main() {
socketUrl := "wss://eastus.api.speech.microsoft.com/cognitiveservices/websocket/v1?TrafficType=AzureDemo&Authorization=bearer%20undefined&X-ConnectionId=" + strings.ToUpper(re.Sub("-", "", uuid.New().String()))
reqCli, err := requests.NewClient(nil)
if err != nil {
log.Panic(err)
}
resp, err := reqCli.Request(nil, "get", socketUrl, requests.RequestOption{
Headers: map[string]string{
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Cache-Control": "no-cache",
"Host": "eastus.api.speech.microsoft.com",
"Origin": "https://azure.microsoft.com",
"Pragma": "no-cache",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.26",
},
})
if err != nil {
log.Panic(err)
}
wsCli := resp.WebSocket()
if err = wsCli.Send(nil,
websocket.MessageText,
createMsg("speech.config", quid, "application/json",
tools.Any2json(map[string]any{
"context": map[string]any{
"system": map[string]string{"name": "SpeechSDK", "version": "1.19.0", "build": "JavaScript", "lang": "JavaScript"},
"os": map[string]string{"platform": "Browser/Win32", "name": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.26",
"version": "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.26"},
},
}).Raw),
); err != nil {
log.Panic(err)
}
if err = wsCli.Send(nil, websocket.MessageText, createMsg("synthesis.context", quid, "application/json",
tools.Any2json(map[string]any{
"synthesis": map[string]any{
"audio": map[string]any{
"metadataOptions": map[string]bool{"bookmarkEnabled": false, "sentenceBoundaryEnabled": false, "visemeEnabled": false, "wordBoundaryEnabled": false},
"outputFormat": "audio-24khz-96kbitrate-mono-mp3",
},
"language": map[string]bool{"autoDetection": false},
},
}).Raw,
)); err != nil {
log.Panic(err)
}
if err = wsCli.Send(nil, websocket.MessageText, createMsg("ssml", quid, "application/ssml+xml",
`
招标125456请尽情使用招标125456
`,
)); err != nil {
log.Panic(err)
}
for {
msgType, msgCon, err := wsCli.Recv(nil)
if err != nil {
log.Panic(err)
}
switch msgType {
case websocket.MessageText:
log.Print(string(msgCon))
if strings.Contains(string(msgCon), "Path:turn.end") {
log.Print("转换结束")
break
}
case websocket.MessageBinary: //音频流
log.Print("读取音频流中")
}
}
}
现在就可以免费的使用微软的文字转语音服务了
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!


