华为语音合成服务,为用户提供实时、可替换、多音调的语音播放体验
在不能操作手机或总盯着手机看的情况下,如何及时获取资讯信息、方便阅读呢?用耳朵听不失为一种好方法。华为机器学习服务的语音合成服务,采用深度神经网络技术,提供高度拟人、流畅自然的语音合成服务。开发者可以在小说阅读、智能硬件、地图导航类应用中集成该能力,为用户提供实时、可替换、多音调的语音播放体验。
语音合成,助力及时性内容送达
语音合成服务支持在线将文字信息转换为语音输出,已在全球部署。该服务的优势有——
多语言、多音色:支持中文、英语、法语、西班牙语、德语、意大利语、俄语、波兰语、泰语、马来语语音合成,更有2种标准男声发音、6种标准女声发音可供选择。
语速、音量可调节:支持多种参数配置,可根据场景需求对发音人的语速、音量进行调整。
集成方式灵活丰富:提供离线SDK、在线SDK快速集成,充分满足不同场景下的语音合成需求。
语音合成服务可以应用于阅读播报、新闻播报、虚拟播报、地图播报、信息通知等及时性较强的场景。比如,用户在骑车、驾车使用地图导航时,路上不方便一直看手机。语音合成广播可以保证表达清晰,准确到达目的地;在司机端打车软件、餐饮叫号、排队软件等场景下,通过语音合成进行订单播报,让用户便捷获取通知信息;市场上很火的电子阅读类应用,提供语音播报和收听功能。用户可以很容易地实现“听书”。即使在锁屏状态下,也可以通过语音播报继续收听,消除地铁、公交、跑步等阅读环境的限制。一些不方便阅读的老人和小孩,同样可以通过“听书”,解决看不清、情绪陪伴等问题。
在智能硬件领域,语音合成服务则可以集成到儿童故事机、智能机器人、平板设备等智能设备上,使人机交互更加自然、亲切。对于短视频App的内容创作者来说,在视频应用中指定文字就可以合成一些语音效果,加快了短视频制作流程。
定制音色,满足用户个性化需求
近期,华为语音合成服务即将上线定制音色功能。用户可以录制并合成自己的声音到应用中,让平日里听小说、导航等生活学习场景更加有趣、亲切。家里有小朋友的父母还可以用自己的声音给孩子们讲故事,释放育儿疲劳的同时加深亲子互动陪伴。
开发实战
开发准备
Maven仓和SDK的配置步骤可以参考开发者网站中的应用开发介绍:
https://developer.huawei.com/consumer/cn/doc/development/hiai-Guides/ml-tts-0000001050068169?ha_source=hms1
- 配置集成的SDK包
在应用的build.gradle文件中,dependencies内添加TTS的SDK依赖:
// 引入基础SDK
implementation 'com.huawei.hms:ml-computer-voice-tts:3.3.0.274'
// 引入离线语音合成bee语音包
implementation 'com.huawei.hms:ml-computer-voice-tts-model-bee:3.3.0.274'
// 引入离线语音合成eagle语音包
implementation 'com.huawei.hms:ml-computer-voice-tts-model-eagle:3.3.0.274'
- 配置AndroidManifest.xml
打开main文件夹中的AndroidManifest.xml文件,可以根据场景和使用需要,配置网络和读写权限,在<application>前添加
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 代码开发(在线TTS)
3.1创建应用自定义的activity界面,用于选择在线或者离线TTS,并通过api_key或者Access Token设置应用鉴权信息
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);MLApplication.getInstance().setAccessToken("your access token");
}
}
3.2 创建TTS配置及TTS 引擎,可以根据需要配置不同参数
MLTtsEngine mlTtsEngine;
MLTtsConfig mlConfigs;mlConfigs = new MLTtsConfig()// Setting the language for synthesis..setLanguage(MLTtsConstants.TTS_ZH_HANS)// Set the timbre..setPerson(MLTtsConstants.TTS_SPEAKER_FEMALE_ZH)// Set the speech speed. Range: 0.2–4.0 1.0 indicates 1x speed..setSpeed(1.0f)// Set the volume. Range: 0.2–4.0 1.0 indicates 1x volume..setVolume(1.0f)// set the synthesis mode..setSynthesizeMode(MLTtsConstants.TTS_ONLINE_MODE);mlTtsEngine = new MLTtsEngine(mlConfigs);
//Sets the volume of the built-in player.
mlTtsEngine.setPlayerVolume(20);
设置回调(回调见3.3)
// Pass the TTS callback to the TTS engine.
mlTtsEngine.setTtsCallback(callback);
3.3 配置TTS回调,接收处理语音合成的结果
MLTtsCallback callback = new MLTtsCallback() {String task = "";String fileName = "audio_" + task;@Overridepublic void onError(String taskId, MLTtsError err) {String str = taskId + " " + err;sendMsg(str);}@Overridepublic void onWarn(String taskId, MLTtsWarn warn) {String str = taskId + " 提示:" + warn;sendMsg(str);}@Overridepublic void onRangeStart(String taskId, int start, int end) {String str = taskId + " onRangeStart [" + start + "," + end + "]";// + temp.get(taskId).substring(start);sendMsg(taskId + " onRangeStart[" + start + "," + end + "]");sendMsg1(taskId, start, end);}@Overridepublic void onAudioAvailable(String taskId, MLTtsAudioFragment audioFragment, int offset,Pair<Integer, Integer> range, Bundle bundle) {if (!task.equals(taskId)) {task = taskId;fileName = "/sdcard/audio_" + task + ".pcm";}writeTxtToFile(audioFragment.getAudioData(), fileName, true);}@Overridepublic void onEvent(String taskId, int eventId, Bundle bundle) {StringBuffer stringBuffer = new StringBuffer();stringBuffer.append(taskId + " ");switch (eventId) {case MLTtsConstants.EVENT_PLAY_START:stringBuffer.append("onPlayStart ");break;case MLTtsConstants.EVENT_PLAY_STOP:stringBuffer.append("onPlayStop ");stringBuffer.append(bundle.getBoolean(MLTtsConstants.EVENT_PLAY_STOP_INTERRUPTED));break;case MLTtsConstants.EVENT_PLAY_RESUME:stringBuffer.append("onPlayResume ");break;case MLTtsConstants.EVENT_PLAY_PAUSE:stringBuffer.append("onPlayPause ");break;case MLTtsConstants.EVENT_SYNTHESIS_COMPLETE:stringBuffer.append("onSynthesisComplete ");PCMCovWavUtil.convertWaveFile(fileName);break;case MLTtsConstants.EVENT_SYNTHESIS_START:stringBuffer.append("onSynthesisStart ");break;case MLTtsConstants.EVENT_SYNTHESIS_END:stringBuffer.append("onSynthesisEnd ");break;}Log.d(TAG, "onEvent: " + stringBuffer.toString());}
};
3.4 调用speak合成请求,及播放控制
String id = mlTtsEngine.speak(text, MLTtsEngine.QUEUE_APPEND));mlTtsEngine.pause();
mlTtsEngine.resume();
mlTtsEngine.stop();调用完毕后,释放引擎
if (mlTtsEngine != null) {mlTtsEngine.stop();mlTtsEngine.shutdown();
}
- 离线TTS
4.1 离线功能需要新增下载发音人模型包的步骤
private MLLocalModelManager mLocalModelManager;
mLocalModelManager = MLLocalModelManager.getInstance();
MLTtsLocalModel mLocalModel = new MLTtsLocalModel.Factory('发音人'
).create();
mLocalModelManager.isModelExist(mLocalModel).addOnSuccessListener(new OnSuccessListener<Boolean>() {@Overridepublic void onSuccess(Boolean aBoolean) {if (aBoolean) {mlTtsEngine.speak(text, MLTtsEngine.QUEUE_APPEND)} else {downloadModel(true); }}
}).addOnFailureListener(new OnFailureListener() {@Overridepublic void onFailure(Exception e) {Log.e(TAG, e.getMessage());}
});
下载模型方法为:
private void downloadModel(final boolean needSpeak) {MLModelDownloadStrategy request = new MLModelDownloadStrategy.Factory().needWifi().create();MLModelDownloadListener modelDownloadListener = new MLModelDownloadListener() {@Overridepublic void onProcess(long alreadyDownLength, long totalLength) {showProcess(alreadyDownLength, "Model download is complete", totalLength);}};mLocalModelManager.downloadModel(mLocalModel, request, modelDownloadListener).addOnSuccessListener(new OnSuccessListener<Void>() {@Overridepublic void onSuccess(Void aVoid) {Log.i(TAG, "downloadModel: " + mLocalModel.getModelName() + " success");showToast("downloadModel Success");updateconfig();if (needSpeak) {speak();}}}).addOnFailureListener(new OnFailureListener() {@Overridepublic void onFailure(Exception e) {Log.e(TAG, "downloadModel failed: " + e.getMessage());showToast(e.getMessage());}});
}
其他使用和在线TTS一致
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~
华为语音合成服务,为用户提供实时、可替换、多音调的语音播放体验相关推荐
- 华为云CDN为用户提供专业全面的加速服务
在数字化的浪潮中,越来越多的企业开始重视并积极利用互联网技术来提高自身竞争力.因此,各种新媒体平台也应运而生.作为数字时代最重要的传播渠道之一--CDN已经成为众多公司和个人争相布局的焦点. 有些人不 ...
- 华为分析服务| 基于用户生命周期 寻找增长机会点
在当下的环境里,几乎所有应用都面临着巨大的用户增长挑战.这其中最主要的原因是互联网的人口红利衰退.用户数量以及增速越来越低,甚至在部分垂类里出现了负增长.电商.生活.游戏等行业的竞争也不断加大,同时, ...
- 华为机器学习服务活体检测再升级,构建安全友好的交互式体验
人脸识别技术被广泛应用于公共安全.金融支付.交通安全等领域.使用较多的场景是用户通过智能手机上的人脸识别技术完成解锁.支付等动作,俗称"刷脸",还有一些开发者会在应用中集成人脸识别 ...
- 【HMS Core 6.0全球上线】华为钥匙环服务,打造跨应用跨形态无缝登录体验
华为钥匙环服务(Keyring),是HMS Core在安全领域开放的全新服务,为全球开发者提供用户认证凭据(以下简称"凭据")本地存储和跨应用.跨形态共享能力,帮助您在安卓应用.快 ...
- 2020英方软件产品发布会:Data+ 为用户提供个性化服务
2020 英方软件产品发布会 10 月 23 日,领先的数据复制基础软件企业英方软件,成功举办以" D+ 新起点·数未来"为主题的"2020 英方软件产品发布会" ...
- OceanBase时序数据库CeresDB正式商用 为用户提供安全可靠的数据存储管理服务
简介: OceanBase完成OLAP和OLTP双重能力并行后,向数据管理领域多模方向迈出第一步. 近日,在数据库OceanBase3.0峰会上,OceanBase CEO杨冰宣布首个时序数据库产品C ...
- 西联汇款和Bharti Airtel向印度数百万银行账户和非洲移动钱包提供实时全球支付服务
丹佛.新德里和肯尼亚内罗毕--(美国商业资讯)--跨境.跨货币汇款和支付服务的全球领导者西联汇款(Western Union)和在18个亚洲和非洲国家开展业务的全球领先电信公司Bharti Airte ...
- Tapdata 创始人唐建法:以秒级响应速度,为企业提供实时数据服务 | 阿里云云原生加速器特别报道
作者:云原生加速器 数字化转型正当时,各行各业都在乘风破浪,加速数字化进程.随着信息化.数字化的不断渗透,企业在经营和业务过程中产生的数据爆发式增长.数据驱动增长的现实条件之下,对数据的获取.处理和应 ...
- 为用户提供质量好,服务好,运作成本低的云计算产品—记新睿云服务团队顺利完成春节保障任务...
2020年1月的武汉新冠病毒肺炎事件突然爆发,让2020年春节变得不同寻常.新型冠状病毒肺炎疫情来势汹汹,各省陆续启动重大公共突发卫生事件一级响应,并实施最严举措全力以赴做好防疫工作,注定这个春节许多 ...
最新文章
- 微生物组-扩增子16S分析研讨会(2020.1)
- linux 时间戳 c语言,c语言中的时间戳和时间格式
- Android热修复技术原理详解(最新最全版本)
- Java 接口和抽象类的区别
- 【每日进步】September 2012
- OTFS Channel Estimation(1)
- 计算机大学生职业规划书word模板,大学生职业规划书范文word模板
- 小波 奇异点 matlab,Matlab小波变换对于奇异点的检测.doc
- BUG计算机术语,程序员bug什么意思
- Android自定义九宫格图案解锁
- github上如何下载单个文件
- 电影《黑客帝国》的真正含义,人类进化的终结吗?
- WordPress整合ckplayer X3视频播放器插件
- 大数据发展前景及就业方向【大数据专业讲座】
- ajax 中的contentType
- python opencv imshow可以显示,但是imwrite却黑乎乎
- mysql 设置多个主码
- Kitty用HTML和css咋做,使用CSS3代码绘制可爱的Hello Kitty猫
- LAYOUT BGA布线规则
- 习题5-7 使用函数求余弦函数的近似值 (15分)