在不能操作手机或总盯着手机看的情况下,如何及时获取资讯信息、方便阅读呢?用耳朵听不失为一种好方法。华为机器学习服务的语音合成服务,采用深度神经网络技术,提供高度拟人、流畅自然的语音合成服务。开发者可以在小说阅读、智能硬件、地图导航类应用中集成该能力,为用户提供实时、可替换、多音调的语音播放体验。

语音合成,助力及时性内容送达

语音合成服务支持在线将文字信息转换为语音输出,已在全球部署。该服务的优势有——

  • 多语言、多音色:支持中文、英语、法语、西班牙语、德语、意大利语、俄语、波兰语、泰语、马来语语音合成,更有2种标准男声发音、6种标准女声发音可供选择。

  • 语速、音量可调节:支持多种参数配置,可根据场景需求对发音人的语速、音量进行调整。

  • 集成方式灵活丰富:提供离线SDK、在线SDK快速集成,充分满足不同场景下的语音合成需求。

语音合成服务可以应用于阅读播报、新闻播报、虚拟播报、地图播报、信息通知等及时性较强的场景。比如,用户在骑车、驾车使用地图导航时,路上不方便一直看手机。语音合成广播可以保证表达清晰,准确到达目的地;在司机端打车软件、餐饮叫号、排队软件等场景下,通过语音合成进行订单播报,让用户便捷获取通知信息;市场上很火的电子阅读类应用,提供语音播报和收听功能。用户可以很容易地实现“听书”。即使在锁屏状态下,也可以通过语音播报继续收听,消除地铁、公交、跑步等阅读环境的限制。一些不方便阅读的老人和小孩,同样可以通过“听书”,解决看不清、情绪陪伴等问题。

在智能硬件领域,语音合成服务则可以集成到儿童故事机、智能机器人、平板设备等智能设备上,使人机交互更加自然、亲切。对于短视频App的内容创作者来说,在视频应用中指定文字就可以合成一些语音效果,加快了短视频制作流程。

定制音色,满足用户个性化需求

近期,华为语音合成服务即将上线定制音色功能。用户可以录制并合成自己的声音到应用中,让平日里听小说、导航等生活学习场景更加有趣、亲切。家里有小朋友的父母还可以用自己的声音给孩子们讲故事,释放育儿疲劳的同时加深亲子互动陪伴。

开发实战

开发准备
Maven仓和SDK的配置步骤可以参考开发者网站中的应用开发介绍:
https://developer.huawei.com/consumer/cn/doc/development/hiai-Guides/ml-tts-0000001050068169?ha_source=hms1

  1. 配置集成的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'
  1. 配置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" />
  1. 代码开发(在线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();
}
  1. 离线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 最新技术资讯~

华为语音合成服务,为用户提供实时、可替换、多音调的语音播放体验相关推荐

  1. 华为云CDN为用户提供专业全面的加速服务

    在数字化的浪潮中,越来越多的企业开始重视并积极利用互联网技术来提高自身竞争力.因此,各种新媒体平台也应运而生.作为数字时代最重要的传播渠道之一--CDN已经成为众多公司和个人争相布局的焦点. 有些人不 ...

  2. 华为分析服务| 基于用户生命周期 寻找增长机会点

    在当下的环境里,几乎所有应用都面临着巨大的用户增长挑战.这其中最主要的原因是互联网的人口红利衰退.用户数量以及增速越来越低,甚至在部分垂类里出现了负增长.电商.生活.游戏等行业的竞争也不断加大,同时, ...

  3. 华为机器学习服务活体检测再升级,构建安全友好的交互式体验

    人脸识别技术被广泛应用于公共安全.金融支付.交通安全等领域.使用较多的场景是用户通过智能手机上的人脸识别技术完成解锁.支付等动作,俗称"刷脸",还有一些开发者会在应用中集成人脸识别 ...

  4. 【HMS Core 6.0全球上线】华为钥匙环服务,打造跨应用跨形态无缝登录体验

    华为钥匙环服务(Keyring),是HMS Core在安全领域开放的全新服务,为全球开发者提供用户认证凭据(以下简称"凭据")本地存储和跨应用.跨形态共享能力,帮助您在安卓应用.快 ...

  5. 2020英方软件产品发布会:Data+ 为用户提供个性化服务

    2020 英方软件产品发布会 10 月 23 日,领先的数据复制基础软件企业英方软件,成功举办以" D+ 新起点·数未来"为主题的"2020 英方软件产品发布会" ...

  6. OceanBase时序数据库CeresDB正式商用 为用户提供安全可靠的数据存储管理服务

    简介: OceanBase完成OLAP和OLTP双重能力并行后,向数据管理领域多模方向迈出第一步. 近日,在数据库OceanBase3.0峰会上,OceanBase CEO杨冰宣布首个时序数据库产品C ...

  7. 西联汇款和Bharti Airtel向印度数百万银行账户和非洲移动钱包提供实时全球支付服务

    丹佛.新德里和肯尼亚内罗毕--(美国商业资讯)--跨境.跨货币汇款和支付服务的全球领导者西联汇款(Western Union)和在18个亚洲和非洲国家开展业务的全球领先电信公司Bharti Airte ...

  8. Tapdata 创始人唐建法:以秒级响应速度,为企业提供实时数据服务 | 阿里云云原生加速器特别报道

    作者:云原生加速器 数字化转型正当时,各行各业都在乘风破浪,加速数字化进程.随着信息化.数字化的不断渗透,企业在经营和业务过程中产生的数据爆发式增长.数据驱动增长的现实条件之下,对数据的获取.处理和应 ...

  9. 为用户提供质量好,服务好,运作成本低的云计算产品—记新睿云服务团队顺利完成春节保障任务...

    2020年1月的武汉新冠病毒肺炎事件突然爆发,让2020年春节变得不同寻常.新型冠状病毒肺炎疫情来势汹汹,各省陆续启动重大公共突发卫生事件一级响应,并实施最严举措全力以赴做好防疫工作,注定这个春节许多 ...

最新文章

  1. 微生物组-扩增子16S分析研讨会(2020.1)
  2. linux 时间戳 c语言,c语言中的时间戳和时间格式
  3. Android热修复技术原理详解(最新最全版本)
  4. Java 接口和抽象类的区别
  5. 【每日进步】September 2012
  6. OTFS Channel Estimation(1)
  7. 计算机大学生职业规划书word模板,大学生职业规划书范文word模板
  8. 小波 奇异点 matlab,Matlab小波变换对于奇异点的检测.doc
  9. BUG计算机术语,程序员bug什么意思
  10. Android自定义九宫格图案解锁
  11. github上如何下载单个文件
  12. 电影《黑客帝国》的真正含义,人类进化的终结吗?
  13. WordPress整合ckplayer X3视频播放器插件
  14. 大数据发展前景及就业方向【大数据专业讲座】
  15. ajax 中的contentType
  16. python opencv imshow可以显示,但是imwrite却黑乎乎
  17. mysql 设置多个主码
  18. Kitty用HTML和css咋做,使用CSS3代码绘制可爱的Hello Kitty猫
  19. LAYOUT BGA布线规则
  20. 习题5-7 使用函数求余弦函数的近似值 (15分)

热门文章

  1. 32位PNG有损压缩为8位
  2. 两个Ctrl键同时失灵了怎么办
  3. Wind River Linux
  4. 第一场嵌入式笔试——CVTE嵌入式应用工程师
  5. pycharm如何恢复工具的主菜单
  6. NEW RDSP MODE I (快速幂)
  7. iphone手机如何用计算机讲游戏,电脑怎么玩ios手游?电脑上玩苹果手机应用和游戏方法...
  8. REST及其RESTful详解
  9. 命令控制qq自动申请远程控制_代码详解
  10. 【Niagara Vykon N4 】物联网学习 01 Station创建