我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

目录

简介

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

集成方法

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

使用方法

总结

简介

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

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

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

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

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

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

集成方法

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

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

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

        ndk {
            abiFilters 'armeabi'
        }
        sourceSets {
            main {
                jniLibs.class="lazy" data-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 语音合成内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

目录简介在线合成和离线合成(合成速度)集成方法在AndroidManifest.xml设置所需要的权限使用方法总结简介 科大讯飞:合成速度快,准确度高,模型多。但问题也是相当明显,只有在线合成是免费的,离线则是一笔不小的开销。 百度:是专门
2022-06-07

Android中使用自带TextToSpeech实现语音合成时Pico TTS引擎不能播放中文怎样解决

要解决Pico TTS引擎无法播放中文的问题,可以尝试以下方法:1. 检查是否安装了合适的中文语言包:Pico TTS并不包含中文语言包,所以需要下载并安装适用于中文的语言包。可以在Google Play商店或其他第三方应用商店中搜索并下载
2023-08-24

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录