Android 实现云知声版离线语音合成

目录
  • 简介
  • 在线合成和离线合成(合成速度)
  • 集成方法
    • 在AndroidManifest.xml设置所需要的权限
    • 使用方法
  • 总结

简介

科大讯飞:合成速度快,准确度高,模型多。但问题也是相当明显,只有在线合成是免费的,离线则是一笔不小的开销。

百度:是专门为他的导航做的一套,性能相对也还可以,但是他只支持离在线混合模式,默认是在wifi情况下是使用在线模式,4g或无网络情况下使用离线模式。

云知声:则可以实现完全的离线合成模式,相比于前两个,性能可能没那没完美,不过对合成的语音要求不高的应用来说,可以考虑接入,缺点就是模型比较少。

在线合成和离线合成(合成速度)

在线合成必须将数据传到第三方平台,调用他们的服务接口进行合成,这中间牵扯到网络状况,在网络良好的情况下,合成速度和离线模式没有太大的差别,但是有时候服务器也会来开个小差,无法保证网络一直都是畅通无阻的。在线模式虽然不太稳定,但是不需要把模型和合成底层代码放在本地,离线合成虽然稳定快速,但是apk体积增加的有点小夸张。

云知声的解决办法:把语音合成模型放在服务器后端,你要使用的时候下载到本地。

集成方法

注册云知声开发者,创建应用,下载离线语音合成sdk,里面就两个文件。

将这里面的所有东西都拷贝到你的项目的对应的libs下(比如app目录下的libs)

在app模块的 build.gradle的defaultConfig括号下加上

        ndk {
            abiFilters 'armeabi'
        }
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
            }
        }

截图如下:

在AndroidManifest.xml设置所需要的权限

    <!-- 网络权限 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- sd卡获得写的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!-- 获取网络状态 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 获取WiFi状态 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <!-- 改变网络状态 -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <!-- 改变WiFi状态 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <!--唤醒锁定-->
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <!--清除应用缓存-->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <!--麦克风权限组-->
    <uses-permission android:name="android.permission.READ_CALENDAR"/>
    <!-- 允许应用写(非读)用户的外部存储器 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!--允许读取电话的状态-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!--允许应用读取用户的联系人数据-->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <!--允许使用电源锁定管理以使进程休眠或屏幕变暗-->
    <uses-permission android:name="android.permission.WAKE_LOCK" />

为了方便使用我这里将云知声语音合成做了进一步的封装,以方便调用,以下是示例,方便大家进行参考

import android.content.Context;
import android.media.AudioManager;
import android.util.Log;

import cn.yunzhisheng.tts.offline.TTSPlayerListener;
import cn.yunzhisheng.tts.offline.basic.ITTSControl;
import cn.yunzhisheng.tts.offline.basic.TTSFactory;
import cn.yunzhisheng.tts.offline.common.USCError;

/**
 * 云知声离线语音封装类
 */
public class SpeechUtilOffline implements TTSPlayerListener {
    public static final String TAG ="SpeechUtilOffline";
    public static final String appKey = "_appKey_";
    private ITTSControl ittsControl;
    private Context context;
    public SpeechUtilOffline(Context context) {
        this.context = context;
        init();
    }

    /**
     * 初始化引擎
     */
    private void init() {
        // 初始化语音合成对象
        ittsControl = TTSFactory.createTTSControl(context, appKey);
        // 设置回调监听
        ittsControl.setTTSListener(this);
        // 设置音频流
        ittsControl.setStreamType(AudioManager.STREAM_MUSIC);
        // 设置播报语速,播报语速,数值范围 0.1~2.5 默认为 1.0
        ittsControl.setVoiceSpeed(2.5f);
        // 设置播报音高,调节音高,数值范围 0.9~1.1 默认为 1.0
        ittsControl.setVoicePitch(1.1f);
        // 初始化合成引擎
        ittsControl.init();
    }

    /**
     * 停止播放
     */
    public void stop(){
        ittsControl.stop();
    }

    /**
     * 播放
     */
    public void play(String content) {
        ittsControl.play(content);
    }

    /**
     * 开始缓冲回调
     */
    @Override
    public void onBuffer() {
        Log.i(TAG, "onBuffer");
    }

    /**
     * 开始播放回调
     */
    @Override
    public void onPlayBegin() {
        Log.i(TAG, "onPlayBegin");
    }

    /**
     * 取消播放回调
     */
    @Override
    public void onCancel() {
        Log.i(TAG, "onCancel");
    }

    /**
     * 语音合成错误回调
     */
    @Override
    public void onError(USCError uscError) {
        Log.i(TAG, "onError");
    }

    /**
     * 播放完成回调
     */
    @Override
    public void onPlayEnd() {
        Log.i(TAG, "onPlayEnd");
        ittsControl.stop();
    }

    /**
     * 初始化成功回调
     */
    @Override
    public void onInitFinish() {
        Log.i(TAG, "onInitFinish");
    }
}

使用方法

SpeechUtilOffline speechUtilOffline = new SpeechUtilOffline(this);
speechUtilOffline.play("此处是需要播放的文本内容")

总结

在集成的时候遇到过很多bug,比如模型文件放在不正确的地方会导致没有声音,模型文件不完整的时候回导致程序崩溃,发音不是预期的效果等等,还有一些参数的设置,具体参数还是得看官方的开发文档。

到此这篇关于Android 实现云知声版离线语音合成的文章就介绍到这了,更多相关Android 语音合成内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android实现语音合成与识别功能

    Android语音合成与语音识别,供大家参考,具体内容如下 这里调用科大讯飞语音的API,语音云开放平台介绍 调用科大讯飞语音的API,需要加添库文件Msc.jar,添加libmsc.so文件,还需添加权限,具体步骤可参看SDK里的文档 参看开发的文档写了一个简单的语音合成和识别demo,图示如下 在EditText里输入文字,点击语音合成,可以实现文字转化为语音 点击语音合成,输入语音,识别的文字以提示的形式显示,并且显示在EditText中 主要代码如下,注意appid需要自己申请 pack

  • Android Studio应用开发集成百度语音合成使用方法实例讲解

    首先,语音合成是指将文本信息转换成声音.意思就是将文本转化为声音,让你的应用开口说话.国内在业内比较有名的第三方语音合成平台有百度语音和科大讯飞. 本文集成的是百度语音合成,其主要特点是: 完全永久免费 业界首创完全永久免费新形式,为开发者提供最流畅最自然的语音合成服务.完全免费,永久使用,彻底摆脱限制. 离线在线融合模式 SDK可以根据当前网络状况,自动判断使用本地引擎还是云端引擎进行语音合成,再也不用担心流量消耗! 多语言多音色可选 中文普通话.中英文混读.男声.女声任你选,更支持语速.音调

  • Android 实现云知声版离线语音合成

    目录 简介 在线合成和离线合成(合成速度) 集成方法 在AndroidManifest.xml设置所需要的权限 使用方法 总结 简介 科大讯飞:合成速度快,准确度高,模型多.但问题也是相当明显,只有在线合成是免费的,离线则是一笔不小的开销. 百度:是专门为他的导航做的一套,性能相对也还可以,但是他只支持离在线混合模式,默认是在wifi情况下是使用在线模式,4g或无网络情况下使用离线模式. 云知声:则可以实现完全的离线合成模式,相比于前两个,性能可能没那没完美,不过对合成的语音要求不高的应用来说,

  • Visual Studio 2017正式版离线安装教程

    Visual Studio 2017 RTM正式版离线安装及介绍. 首先至官网下载:https://www.visualstudio.com/zh-hans/downloads/ VS 2017 正式版介绍:https://www.visualstudio.com/zh-hans/vs/whatsnew/ VS 2017 离线模式只离线.NET Core部分: Visual Studio Professional 2017: vs_professional.exe--layoutD:\vs201

  • 微信扫码支付零云插件版实例详解

    微信扫码支付零云插件版实例详解 微信的扫码支付主要有以下过程: 向微信统一下单地址发送详细的订单信息,微信返回json数据,里面包含生成二维码的字段,使用生成二维码的插件qrcode生成二维码返回给前端,让用户扫码完成支付,然后页面跳转到return_url告知用户支付成功,微信服务器正式通知支付成功之后修改数据库数据. //Pay类下的主要方法 public function buildRequestForm($pay_data){ $UNIFIED_ORDER_URL = 'weixin:/

  • Android 阿里云OSS文件上传的实现示例

    估计有小伙伴看到阿里云oss的api文档十脸懵逼了,啊哈哈哈,接下来博主就来拯救你了,看完觉得好的就关注博主吧,么么么么么哒!!! 想要自己研究阿里云oss的,博主开启传送门给你:阿里云oss 一.项目导入阿里云oss的SDK 方式1:在build文件添加依赖(博主和官方一致推荐) dependencies { //阿里云oss implementation 'com.aliyun.dpa:oss-android-sdk:+' } 方式2:源码编译jar包 源码传送门:官方阿里云oss源码 二.

  • Android 多渠道打包进阶版

    目录 Android 多渠道打包进阶版 1.资源文件配置 2.依赖配置 3.签名配置 上一篇文章链接//www.jb51.net/article/221446.htm Android 多渠道打包进阶版 文章开始前,先看一下下面这种情况: android { productFlavors { //100 个多渠道配置 } //多渠道签名的配置 signingConfigs { xiaomi { storeFile file("../xiaomi.keystore") storePassw

  • 阿里云国际版使用Nginx作为HTTPS转发代理服务器的处理方法

    目录 HTTP/HTTPS 转发代理的分类 转发代理处理 HTTPS 流量时需要特殊处理 NGINX解决方案 HTTP 连接隧道 (L7 解决方案) 历史背景 ngx_http_proxy_connect_module 环境建设 应用场景 NGINX流(L4解决方案) 常见问题 ngx_stream_ssl_preread_module 环境建设 应用场景 常见问题 结论 NGINX最初被设计为反向代理服务器.但是,随着不断发展,NGINX也可以作为实现转发代理的选项之一.转发代理本身并不复杂,

  • Android Studio 1.2版安装设置图文教程

    这两天Google更新了Android Studio 1.2正式版,新版本的设置界面大变面,设置条目较旧版本进行了归类,不像以前那样列表长长的了. 趁着安装新版本的机会,把常用的设置记录一下,放到博客里面,以作备忘. 下载 正式版的Android Studio和SDK可以在下面的链接进行下载 http://developer.android.com/sdk/index.html 关于下载,我建议下载绿色版的Android Studio和SDK,别下安装包版捆绑版的,这样如果有哪个出了问题要重装,

  • 安装android开发环境原始版(windows版)

    一.下载需要用到的工具:(1)下载JAVA的IDE开发工具– Eclipse到Eclipse官方网站下载Ecplise For Java EE的最新Windows版本(2)下载Java开发包 - Java SE Development Kit (JDK) JDK 6到Sun官方网站下载JDK6,选择JDK 6 Update 12(3)下载Android开发包 - Android SDK到Google的官方网站下载Android的开发包For Windows的 二.下载完需要的工具之后,开始安装(

  • Android搜索框通用版

    之前项目总会遇到很多搜索框类的功能,虽然不是很复杂,不过每次都要去自己处理数据,并且去处理搜索框的变化,写起来也比较麻烦,今天来做一个比较简单的通用搜索栏. 先看下效果图: 没什么特别的,只是今天要做的就是简单的把搜索框的内容封装一下. 一.分析功能 先考虑一下,搜索框一般都是由一个搜索图标(一般都是一个放大镜),一个输入框和一个清除按钮组成.然后会通过监听输入框的变化去处理清除按钮的显示和隐藏并且去过滤相关的数据.最后去刷新适配器,显示过滤后的数据.基本上搜索框的功能都大同小异. 有了上边的分

随机推荐