Xamarin开发笔记—百度在线语音合成

《是时候开始用C#快速开发移动应用了》刷屏之后,把C#开发移动应用的技术 => Xamarin,在这里和大家做一个分享!

语音合成:也被称为文本转换技术(TTS),它是将计算机自己产生的、或外部输入的文字信息转变为可以听得懂的、流利的口语输出的技术。

技术选型:语音合成初步选择有两个,一是讯飞、二是百度。

因为使用的是Xamarin开发在对接讯飞的时候android绑定上有些问题,攻克不了,讯飞对于Xamarin的态度也是观望,可能是因为国内使用Xamarin的比较少。先来说说讯飞和百度语音各自的优缺点:

  1.讯飞支持的字节数更多8xxx字节,具体的值忘记了,反正4k的汉字不成问题;百度支持的字节数是1024个字节。

  2.讯飞sdk比较小,对接百度的sdk比较大,因为百度语音的离线在线sdk在一个里面,大概有10几兆所以,为了避免安装包过大,所有只能使用百度的REST方式了。

  3.讯飞语音sdk在Xamarin.Android绑定上有问题,暂时没有攻破,在Xamarin.Ios上打调试版也有问题,设置成Release上勉强可以使用。

综合上面的原因,所以选择了百度的REST作为对接语音合成的技术实现。

调用流程:1.获取语音合成密码access_token2.带上秘钥和文本请求api返回数据流文件;


 

 核心流程方案

步骤一获取access_token

请求地址:

https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=你的id&client_secret=你的secret&

参数说明:

  • grant_type:必须参数,固定为“client_credentials”;
  • client_id:必须参数,应用的 API Key;
  • client_secret:必须参数,应用的 Secret Key;

返回结果:

{

  "access_token": "24.6a0d0ee7cc62446cf0a5fbc9d6204321.2592000.1498802594.282335-9044454",

  "session_key": "9mzdDZfH3RYNxaNq9Kb6RP5JqsthOmat9g4guVLvbm2YymOWPxDiq3vQvdjZrByadZp4qou9F4wYH2dfptIjxdPwzmKH",

  "scope": "public audio_tts_post wise_adapt lebo_resource_base lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian wangrantest_test wangrantest_test1 bnstest_test1 bnstest_test2 vis-classify_flower",

  "refresh_token": "25.df4ee25f807fe4fc8d0e025dc7b8549e.315360000.1811570594.282335-9044454",

  "session_secret": "237af35e4de40ce40e74951d5e187a18",

  "expires_in": 2592000

}

注意:access_token有效期30天。

 

步骤二:合成音频

请求地址:

http://tsn.baidu.com/text2audio?tex=这是要转换的文本内容&lan=zh&cuid=userid&ctp=1&tok=24.6a0d0ee7cc62446cf0a5fbc9d6204321.2592000.1498802594.282335-9044454

注意:参数都需要经过两次 URLENCODE 操作。如果是直接在浏览器地址栏输入则不需要。

返回结果:

如果合成成功,下行数据为二进制语音文件,具体header信息 Content-Type:audio/mp3;如果合成出现错误,则会返回json结果,具体header信息为:Content-Type:application/json。其中sn数据主要用于DEBUG追查问题,如果出现问题,可以提供sn帮助确认问题。

错误实例为:

{"err_no":500,"err_msg":"notsupport.","sn":"abcdefgh","idx":1}

错误码解释

错误码

含义

500

不支持输入

501

输入参数不正确

502

token验证失败

503

合成后端错误

 

注意:合成文本长度必须小于1024字节,如果本文长度较长,可以采用多次请求的方式。切忌不可文本长度超过限制。

更多官方文档请访问:http://yuyin.baidu.com/docs


 

Xamarin调用核心代码如下:

string url = "http://tsn.baidu.com/text2audio"; //百度tts请求地址
HttpClient client = new HttpClient();
client.Timeout = new TimeSpan(0, 1, 0); //超时时间设置
Dictionary<string, string> param = new Dictionary<string, string>() {
{ "lan", "zh" },{ "ctp", "1" } //不需要修改的参数
};
param.Add("tex", "需要合成的文本内容"); //需要转换的文本内容
param.Add("cuid", "userid"); //用户唯一标识
param.Add("tok", "24.6a0d0ee7cc62446cf0a5fbc9d6204321.2592000.1498802594.282335-9044454");//access_token,在发送之前先调用一次获取到这个值
FormUrlEncodedContent content = new FormUrlEncodedContent(param); //post请求参数设置对象
try
{
HttpResponseMessage x = await client.PostAsync(url, content);
if (x.StatusCode == HttpStatusCode.OK)
{
Stream st = await x.Content.ReadAsStreamAsync();
//路径保存地址,ios和android各不相同,分别实现,传递文件名
string filePath = DependencyService.Get<IResourcesHelper>().GetImageDownLoadPath("bd_" + DateTime.Now.Ticks + ".mp3");
using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
st.CopyTo(fileStream); //保存文件
}
}
else
{
//todo:请求失败处理逻辑(警告)
}
}
catch
{
//todo:异常处理逻辑(警告)
}

  

Xamarin系列其他推荐 


  • 《Xamarin开发笔记—WebView双项事件调用》
  • 《Xamarin开发笔记—百度在线语音合成》
  • 《Xamarin开发笔记—设备类&第三方弹窗的使用和注意事项》

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Oracle comment on注释信息方法论》

更多精彩内容尽在leonarding.blog.51cto.com《Oracle comment on注释信息方法论》引言&#xff1a;在DBA日常工作中写注释信息可能会经常有&#xff0c;但用Oracle命令来写和使用我想应该不是很多&#xff0c;其实Oracle给我们提供了非常丰富的语言表述语法&#xff0c;而我们日…

利用MFC按钮使能(或禁用)属性使按钮变正常色(或灰色)

利用MFC按钮使能&#xff08;或禁用&#xff09;属性使按钮变正常色&#xff08;或灰色&#xff09; GetDlgItem(IDC_XXX)->EnableWindow(FALSE)//IDC_XXX为你想变灰的按钮的ID 利用你找到的handle&#xff0c;或者窗体&#xff08;按钮也是一个窗体&#xff09;指针&#…

js处理16进制hex转str出现的中文乱码问题

昨天從FB下載了一份包含所有對話紀錄的JSON檔&#xff0c;但裡面的中文字編碼有問題&#xff0c;通通變成下面這個樣子 "\u00e7\u0094\u009f\u00e6\u0097\u00a5"本來想說這種事情應該很簡單&#xff0c;就把他每個字元當成char轉存不就得了&#xff0c;結果轉出來的東…

CentOS 6.2 本地安装YUM

一般学习linux的同学都是先学习的Red hat吧&#xff0c;小编也是如此&#xff0c;但是在生产环境中&#xff0c;大多数企业用的是基于redhat 内核的 centos &#xff0c;小编最近在接触centos时&#xff0c;就发现了不少问题&#xff0c;今天先从本地YUM说起。 redhat配置本地Y…

MFC设置对话框背景色及控件颜色

MFC设置对话框背景色及控件颜色 一、使用背景图片更改对话框背景色 在对话框源文件void CxxDlg::OnPaint()函数中 if (IsIconic()) { (这里省略) } else { CDialogEx::OnPaint(); } else里面添加下列代码&#xff1a; 效果如下图所示&#xff1a; 二、使用颜色更改对话…

Stacked Hourglass Networks 人体姿态检测

本文是人体关键点中非常经典的一篇文章&#xff1a;Stacked Hourglass Networks for Human Pose Estimation 论文地址&#xff1a; https://arxiv.org/abs/1603.06937​arxiv.org 代码地址&#xff1a; wbenbihi/hourglasstensorlfow​github.com​编辑 论文框图&#xff1…

Xamarin开发笔记—设备类amp;第三方弹窗的使用和注意事项

一、设备类是Xamarin重要开发组成部分&#xff0c;下面介绍一下设备类的主要用法&#xff1a; //唤醒打电话Device.OpenUri(new Uri("tel:180xxxxxxxx"));//打开网页Device.OpenUri(new Uri("http://vipstone.cnblogs.com/"));//判断当前运行平台Device.Ru…

Windows Azure 安全最佳实践 - 第 4 部分:需要采取的其他措施

那么&#xff0c;哪些安全威胁应由WindowsAzure环境缓解&#xff1f;哪些安全威胁必须由开发人员缓解&#xff1f; 开发 Windows Azure 应用程序的最佳安全做法一文说明了对于在 Windows Azure 中运行的应用程序而言&#xff0c;什么样的威胁应被视为主要威胁。它还专门说明了 …

逻辑性最强的React Native环境搭建与调试

ReactNative系列文章&#xff1a; 1.《逻辑性最强的React Native环境搭建与调试》 2.《ReactNative开发工具有这一篇足矣》 正文 React Native&#xff08;以下简称RN&#xff09;&#xff0c;已经“火”了好一段时间了&#xff0c;网上的资料相对也很丰富&#xff0c;只是一…

自绘热点按钮

自绘热点按钮 一、1.在VS2010中新建MFC对话框工程&#xff0c;命名“Test”。 2.删除对话框上所有控件&#xff0c;然后在对话框上添加一个按钮&#xff0c;一个组合框&#xff0c;一个编辑框&#xff0c;更改按钮ID为IDC_TRANSFORM_BTN&#xff0c;更改编辑框ID为IDC_EDIT2。…

YOLOv5在建筑工地中安全帽佩戴检测的应用(已开源+数据集)

前言 Amusi 发现一个很棒的开源项目&#xff0c;利用YOLOv5进行目标检测的"落地化"应用&#xff1a;安全帽佩戴检测。 该项目使用了YOLOv5s、YOLOv5m、YOLOv5l来训练安全帽佩戴检测数据集&#xff0c;代码和权重均已开源&#xff01;安全帽佩戴检测数据集也是开源的…

centos上安装adobe flash

1、下载adobe yum源rpm包并安装rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-x86_64-1.0-1.noarch.rpmrpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux2、通过yum命令安装adobe flashyum install flash-plugin nspluginwrapper alsa-plugins-…

linux运行可执行文件,通过c语言调用java的main方法

前言&#xff1a;以前一直在做Android开发&#xff0c;在某本书上看过一句话“Android上面不只有App类的程序可以运行&#xff0c;能在linux下运行的程序&#xff0c;也可以在Android上面运行” 一.编写C语言部分代码 1.定义java.h头文件 #include <jni.h>#ifndef _JAV…

MFC串口通信设置及发送、中断接收程序

前一段做了个串口通信小软件&#xff0c;就是现实利用上位机软件通过串口通信对下位机&#xff08;单片机&#xff09;通信&#xff0c;校时LED点阵万年历&#xff0c;省去按键调节的麻烦&#xff0c;方便校时&#xff0c;省时省力。 为右击 串口通信控件&#xff0c;添加关联…

ReactNative开发工具有这一篇足矣

ReactNative系列文章&#xff1a; 1.《逻辑性最强的React Native环境搭建与调试》 2.《ReactNative开发工具有这一篇足矣》 正文 React Native&#xff08;以下简称RN&#xff09;开发工具的文章很多&#xff0c;几乎千篇一律都是Copy的&#xff08;一毛一样&#xff09;&a…

【K8S】Docker向私有仓库拉取/推送镜像报错(http: server gave HTTP response to HTTPS client)

这里&#xff0c;我们搭建的Harbor仓库的地址为 http://192.168.175.101:1180。 报错信息如下所示。 [rootbinghe101 ~]# docker login 192.168.175.101:1180 Username: binghe Password: Error response from daemon: Get https://192.168.175.101:1180/v2/: http: server …

MFC串口通信串口指示灯的实现

前一段做了个串口通信小软件&#xff0c;当打开串口时串口指示灯亮&#xff0c;关闭串口时串口指示灯灭&#xff0c;实现方法如下&#xff1a; 1.在资源视图中&#xff0c;添加两个图标&#xff0c;分别为串口指示灯灭IDI_ICON1&#xff0c;串口指示灯亮IDI_ICON2。 2.在串口通…

07-Windows Server 2012 R2 会话远程桌面-标准部署-RD授权

Windows Server 2012 R2 会话远程桌面-标准部署-RD授权马博峰当完成所有的部署后&#xff0c;在实际操作中没有任何问题&#xff0c;并完成所有的测试&#xff0c;在所有工作的最后一步就是需要安装RD授权服务器&#xff0c;远程桌面授权&#xff08;RD 授权&#xff09;以前称…

解决React Native unable to load script from assets index.android.bundle on windows

React Native运行的时候&#xff0c;经常碰到React Native unable to load script from assets index.android.bundle on windows解决方法有2种&#xff1a; 方法一&#xff1a;设置IP和端口 具体步骤&#xff1a;报错页面晃动手机&#xff0c;显示菜单 》 点击Dev Settings …

CentOS 安装go client调用Kubernetes API

CentOS 安装 Go环境并配置goproxy wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz tar -xzvf go1.14.4.linux-amd64.tar.gz -C /usr/local/ mkdir -p /home/gopath cat >> /etc/profile <<EOF export GOROOT/usr/local/go export GOPATH/home/gopath…