【API解析】微软edge浏览器大声朗读功能(read aloud)调用步骤

这篇具有很好参考价值的文章主要介绍了【API解析】微软edge浏览器大声朗读功能(read aloud)调用步骤。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【API解析】微软edge浏览器大声朗读功能(read aloud)调用步骤

1. 来源

  • github: MsEdgeTTS, edge-TTS-record
  • 吾爱破解:微软语音助手免费版,支持多种功能,全网首发

2. 准备工作

  • 功能来源:edge浏览器
  • 抓包工具:fiddler
  • 模拟请求:postman

3. 主要分析步骤

  • 第一步:确定edge浏览器read aloud功能用js如何调用,fiddler上没有捕捉到
const voices = speechSynthesis.getVoices()
function speakbyvoice(text, voice) {
	var utter = new SpeechSynthesisUtterance(text)
	for (let v of voices) {
		if (v.name.includes(voice)) {
			utter.voice = v
			break
		}
	}
	speechSynthesis.speak(utter)
	return utter
}
speakbyvoice("hello world", "Xiaoxiao")
  • 第二步:试着对edge-TTS-record抓包,抓到了一个http请求websocket连接。对照MsEdgeTTS的代码可知:
/*
 * postman中模拟成功
 * 获取可用语音包选项,等价于speechSynthesis.getVoices()
 * http url: https://speech.platform.bing.com/consumer/speech/synthesize/readaloud/voices/list?trustedclienttoken=6A5AA1D4EAFF4E9FB37E23D68491D6F4
 * method: GET
 */
{
	uri: "https://speech.platform.bing.com/consumer/speech/synthesize/readaloud/voices/list",
	query: {
		trustedclienttoken: "6A5AA1D4EAFF4E9FB37E23D68491D6F4"
	}
	method: "GET"
}

/*
 * postman中模拟成功
 * 发送wss连接,传输文本和语音数据,等价于speechSynthesis.speak(utter)
 * wss url: wss://speech.platform.bing.com/consumer/speech/synthesize/readaloud/edge/v1?TrustedClientToken=
 * send: 发送两次数据,第一次是需要的音频格式,第二次是ssml标记文本(需要随机生成一个requestid,替换掉guid的分隔符“-”即可)
 * receive: 接收到的webm音频字节包含在相同requestid的正文部分,用Path=audio\r\n定位正文索引
 * 存在的问题: 1、第一次发送的音频格式文本中,只有在webm-24khz-16bit-mono-opus格式下才能成功连接,其他格式尝试后直接断开;
 *           2、第二次发送的ssml文本不支持mstts命名空间的解析,是Auzure语音服务的阉割版,例如不能出现xmlns:mstts="****"、<mstts:express-as/>、<p/>、<s/>等语言标记
 */
{
	uri: "https://speech.platform.bing.com/consumer/speech/synthesize/readaloud/voices/list",
	query: {
		trustedclienttoken: "6A5AA1D4EAFF4E9FB37E23D68491D6F4"
	},
	sendmessage: {
		audioformat: `
X-Timestamp:Mon Jul 11 2022 17:50:42 GMT+0800 (中国标准时间)
Content-Type:application/json; charset=utf-8
Path:speech.config

{"context":{"synthesis":{"audio":{"metadataoptions":{"sentenceBoundaryEnabled":"false","wordBoundaryEnabled":"true"},"outputFormat":"webm-24khz-16bit-mono-opus"}}}}`,
		ssml: `
X-RequestId:7e956ecf481439a86eb1beec26b4db5a
Content-Type:application/ssml+xml
X-Timestamp:Mon Jul 11 2022 17:50:42 GMT+0800 (中国标准时间)Z
Path:ssml

<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='en-US'><voice  name='Microsoft Server Speech Text to Speech Voice (zh-CN, XiaoxiaoNeural)'><prosody pitch='+0Hz' rate ='+0%' volume='+0%'> hello world</prosody></voice></speak>`
	}
}

4. 编写代码

  • websocket库:WebSocketSharp。最新版安装失败的可以降版本安装,此文发布的时候最新预览版是1.0.3-rc11
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using WebSocketSharp; // nuget包:WebSocketSharp(作者:sta,此文安装版本:1.0.3-rc10)

namespace ConsoleTest
{
    internal class Program
    {
        static string ConvertToAudioFormatWebSocketString(string outputformat)
        {
            return "Content-Type:application/json; charset=utf-8\r\nPath:speech.config\r\n\r\n{\"context\":{\"synthesis\":{\"audio\":{\"metadataoptions\":{\"sentenceBoundaryEnabled\":\"false\",\"wordBoundaryEnabled\":\"false\"},\"outputFormat\":\"" + outputformat + "\"}}}}";
        }
        static string ConvertToSsmlText(string lang, string voice, string text)
        {
            return $"<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='https://www.w3.org/2001/mstts' xml:lang='{lang}'><voice name='{voice}'>{text}</voice></speak>";
        }
        static string ConvertToSsmlWebSocketString(string requestId, string lang, string voice, string msg)
        {
            return $"X-RequestId:{requestId}\r\nContent-Type:application/ssml+xml\r\nPath:ssml\r\n\r\n{ConvertToSsmlText(lang, voice, msg)}";
        }
        
        static void Main(string[] args)
        {
            var url = "wss://speech.platform.bing.com/consumer/speech/synthesize/readaloud/edge/v1?trustedclienttoken=6A5AA1D4EAFF4E9FB37E23D68491D6F4";
            var Language = "en-US";
            var Voice = "Microsoft Server Speech Text to Speech Voice (zh-CN, XiaoxiaoNeural)";
            var audioOutputFormat = "webm-24khz-16bit-mono-opus";
            var binary_delim = "Path:audio\r\n";

            var msg = "Hello world";
            var sendRequestId = Guid.NewGuid().ToString().Replace("-", "");
            var dataBuffers = new Dictionary<string, List<byte>>();

            var webSocket = new WebSocket(url);
            webSocket.SslConfiguration.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
            webSocket.OnOpen += (sender, e) => Console.WriteLine("[Log] WebSocket Open");
            webSocket.OnClose += (sender, e) => Console.WriteLine("[Log] WebSocket Close");
            webSocket.OnError += (sender, e) => Console.WriteLine("[Error] error message: " + e.Message);
            webSocket.OnMessage += (sender, e) =>
            {
                if (e.IsText)
                {
                    var data = e.Data;
                    var requestId = Regex.Match(data, @"X-RequestId:(?<requestId>.*?)\r\n").Groups["requestId"].Value;
                    if (data.Contains("Path:turn.start"))
                    {
                        // start of turn, ignore. 开始信号,不用处理
                    }
                    else if (data.Contains("Path:turn.end"))
                    {
                        // end of turn, close stream. 结束信号,可主动关闭socket
                        // dataBuffers[requestId] = null;
                        // 不要跟着MsEdgeTTS中用上面那句,音频发送完毕后,最后还会收到一个表示音频结束的文本信息
                        webSocket.Close();
                    }
                    else if (data.Contains("Path:response"))
                    {
                        // context response, ignore. 响应信号,无需处理
                    }
                    else
                    {
                        Console.WriteLine("unknow message: " + data); // 未知错误,通常不会发生
                    }
                }
                else if (e.IsBinary)
                {
                    var data = e.RawData;
                    var requestId = Regex.Match(e.Data, @"X-RequestId:(?<requestId>.*?)\r\n").Groups["requestId"].Value;
                    if (!dataBuffers.ContainsKey(requestId))
                        dataBuffers[requestId] = new List<byte>();
                    if (data[0] == 0x00 && data[1] == 0x67 && data[2] == 0x58)
                    {
                        // Last (empty) audio fragment. 空音频片段,代表音频发送结束
                    }
                    else
                    {
                        var index = e.Data.IndexOf(binary_delim) + binary_delim.Length;
                        dataBuffers[requestId].AddRange(data.Skip(index));
                    }
                }
            };


            webSocket.Connect();
            var audioconfig = ConvertToAudioFormatWebSocketString(audioOutputFormat);
            webSocket.Send(audioconfig);
            webSocket.Send(ConvertToSsmlWebSocketString(sendRequestId, Language, Voice, msg));

            while (webSocket.IsAlive) { }
            Console.WriteLine("接收到的音频字节长度:" + dataBuffers[sendRequestId].Count);
            Console.ReadKey(true);
        }
    }
}

5. 结语

模拟websocket请求成功,缺陷是postman模拟结果显示音频outputformat参数只能是webm-24khz-16bit-mono-opus,也就是说还需要再用ffmpeg之类的库转换格式。暂时也没找到比较好用的库,先记录到这文章来源地址https://www.toymoban.com/news/detail-457949.html

到了这里,关于【API解析】微软edge浏览器大声朗读功能(read aloud)调用步骤的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 打开IE浏览器就会跳转到Microsoft Edge微软浏览器如何解决

    某件事情必须要用到IE浏览器 一打开IE浏览器时却老是会跳转到Microsoft Edge浏览器,不知道如何解决 1、因为微软已将开发重心放在基于Chromium的新版Edge浏览器上,而传统的InternetExplorer则逐渐被淘汰。 2、也就是说,如果当前使用的是IE浏览器,可以考虑切换到新版Edge浏览器,

    2024年02月11日
    浏览(75)
  • 如何在微软Edge浏览器上一键观看高清视频?

    编者按:视频是当下最流行的媒体形式之一。但由于视频压缩、网络不稳定等原因,我们常常可以看到互联网上的很多视频其画面质量并不理想,尤其是在浏览器端,这极大地影响了观看体验。不过,近期微软 Edge 浏览器推出了一项新功能,一键就可以让浏览器中的视频变为

    2024年02月07日
    浏览(57)
  • Microsoft Edge v107.0.1418.35 微软Edge浏览器便携版

    Microsoft Edge 微软Edge浏览器绿色增强版由shuax基于官方正式版打包而成,绑定便携化注入模块Edge++增强软件,强制实现flash插件支持,解除了Adobe Flash Player地区不相容限制和移除警告提示,增强了标签页功能。微软Edge浏览器独立发行版于2020年正式上线迅速的火爆起来。Microsof

    2024年02月05日
    浏览(58)
  • 微软 Edge 浏览器 Tracking Prevention 的强制措施的一个例子

    Microsoft Edge 中跟踪预防功能的第一个组件是分类。 为了对在线跟踪器进行分类并将它们分组,Microsoft Edge 使用了断开连接开源跟踪保护列表, 即所谓的 Disconnect open source tracking protection lists . 这些列表通过“信任保护列表”组件提供,该组件可在 edge://components 中查看。 下载后

    2024年02月10日
    浏览(71)
  • 设置微软Edge浏览器主页和新标签页,摆脱扰人和分散注意力的主页

    默认情况下,Microsoft Edge会向您显示世界上最令人分心和讨厌的主页(也称为主屏幕)。微软不想只向你展示一个搜索框,也许还有一个漂亮的背景或一些你喜欢的网站的快捷方式,而是想在你面前扔一堆新闻标题和广告。 你可能会打开浏览器阅读电子邮件,结果被Microsoft

    2024年02月11日
    浏览(65)
  • 微软账户0x80070520错误,edge浏览器“无法使你登录,错误代码3、15 1067”,office登录失败

    edge错误代码3、15 1067 win10设置里登录微软账户报0x80070520错误 解决方法: 删除(系统盘):Users(用户名)AppDataLocalMicrosoftWindows下 UsrClass.dat文件,并从default用户同位置复制一个过来,注销账户重新登陆 这会将视觉样式重置,但是可以解决登录微软账户异常,激活office和同

    2024年02月11日
    浏览(45)
  • appemit 支持chrome edge谷歌微软浏览器佳博Gprinter 标签打印机 TSCLIB.DLL 函数库使用说明

    支持谷歌 firefox edge 360 qq sogou等各种浏览器,在线使用 佳博Gprinter 标签打印机 直接js操作 TSCLIB.DLL 函数库使用说明 请在使用TSCLIB.DLL 前,安装条形码打印机驱动程序。 1. openport(a) 说明: 指定计算机端的输出端口 参数: a: 单机打印时,请指定打印机驱动程序名称,例如: TSC TDP

    2024年02月04日
    浏览(52)
  • 查看及修改微软Edge浏览器用户数据保存位置(包括详细历史记录(页面停留时间,页面访问次数,最后访问时间,下载历史等),Cookie,书签等)

    (把上面的XXX对应自己电脑的用户名) (其中很多没有后缀名的文件都是数据库文件,只需修改后缀名为“.db”,然后用数据库管理软件打开即可,当然不都是数据库文件,有些不是) 不过由于分库分表的原因,信息都分散在各个数据库里面,多张表里面。所以单张表里面记

    2024年02月16日
    浏览(405)
  • Chrome 浏览器插件 cookies API 解析

    前端开发肯定少不了和 cookie 打交道,此文较详细的介绍下 chrome.cookie 的 API 以及在 popup、service worker、content 中如何获取的 如果需使用 Cookie API ,需要在 manifest.json 文件中添加权限( Permissions )和主机权限( host_permissions )字段 比如,我需要获取 domain 为 .lkcoffee.com 的 cook

    2024年01月21日
    浏览(51)
  • Chrome 浏览器 Manifest V3 版本中 scripting API 解析

    Chrome 浏览器 Manifest V3 版本中 scripting API 解析 使用  chrome.scripting API 在不同上下文中执行脚本。 可以使用  chrome.scripting API 将 JavaScript 和 CSS 注入网站。 scripting 使用  chrome.scripting API ,需要在 manifest.json 中声明  scripting  权限,以及要向其注入脚本的网页的主机权限。使

    2024年01月19日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包