前言:目前市面上的语音合成平台有很多,讯飞,百度等等。目前使用讯飞tts语音合成。

语音合成分为方式:

一、使用讯飞语音开放平台在线语音合成SDK。

优点:免费,有统计数据,发音人种类贼多。

缺点:合成次数限制,装机量限制。免费版有时候因为网络因素会有延迟,次数没通过审核前<500次/天,装机量有限,需要                     提交引用审核方可提升至<2w次/天。审核要求是应用界面有讯飞语音技术支持。

二、使用讯飞语音开放平台离线语音合成SDK。

优点:快,无延迟。

缺点:收费。。。。

三、使用讯飞语记apk,进行语音合成。

优点:快,免费,无延迟,无装机量限制,无合成次数限制。

缺点:需要在安卓设备上安装讯飞语记apk,然后在开发者的应用中 调用讯飞语记的tts引擎。

前言总结:

使用讯飞语记实现语音语音合成的好处:免费,不受制网络传输速度,发音人选择种类多,不限装机量,不限合成次数。

实现过程:在自己的应用程序中,调用讯飞语记.apk来进行合成。下载地址:讯飞语记.apk

使用讯飞语记的步骤:

一、在自己的工程里加入jar包(sunflower.jar  &  Msc.jar )和各个so库,下载demo。

二、在工程里加入代码:

1.初始化讯飞sdk:

①在自己的application中加入初始化讯飞sdk代码。

private void initItfly(){        
        // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成 
        //SpeechUtility对象为null
        // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数: 
        //SpeechConstant.FORCE_LOGIN+"=true"
        // 参数间使用“,”分隔。
        // 设置你申请的应用appid
 
        // 注意: appid 必须和下载的SDK保持一致,否则会出现10407错误
        StringBuffer param = new StringBuffer();
        param.append("appid=" + getString(R.string.app_id));
        //        param.append("appid=" + "11111111");
        //        param.append(",");
        //         设置使用v5+
        //        param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC);
        SpeechUtility utility = SpeechUtility.createUtility(this, param.toString());
        try {
            mSpeechSynthesizerUtil = new SpeechSynthesizerUtil(getApplicationContext());
        } catch (Exception e) {
        }
}
           ②创建工具类 SpeechSynthesizerUtil。

/**
 * Created by Kai .
 * time on 2017/3/20.
 * design:语音合成工具类
 */
public class SpeechSynthesizerUtil {
    // 语音合成对象
    public SpeechSynthesizer mTts;
 
    // 默认云端发音人
    public static String voicerCloud = Constants.VOICERCLOUD;
    //    // 云端发音人列表
//    private String[] cloudVoicersEntries;
    // 引擎类型
    private String mEngineType = SpeechConstant.TYPE_LOCAL;
    private SharedPreferences mSharedPreferencesSpeech;
 
    //缓冲进度
    private int mPercentForBuffering = 0;
    //播放进度
    private int mPercentForPlaying = 0;
    private Context mContext;
    public SpeechSynthesizerUtil(Context context) {
        this.mContext = context;
        // 初始化合成对象
        /**
         * 初始化监听。
         */
         InitListener mTtsInitListener = new InitListener() {
            @Override
            public void onInit(int code) {
                Util.LogUtil.d("InitListener init() code = " + code);
                if (code != ErrorCode.SUCCESS) {
                    ToastUtil.showToast("初始化失败,错误码:" + code);
                } else {
                    // 初始化成功,之后可以调用startSpeaking方法
                    // 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,
                    // 正确的做法是将onCreate中的startSpeaking调用移至这里
                }
            }
        };
 
        mTts = SpeechSynthesizer.createSynthesizer(context, mTtsInitListener);
//       这里使用讯飞语记合成,就把下面设置参数的代码全注释掉。如果使用讯飞别的方式合成就别注释
//        mSharedPreferencesSpeech = context.getSharedPreferences(Constants.PREFER_NAME, Activity.MODE_PRIVATE);
        // 设置参数
        // TODO:待取消注释代码
//        Util.setSpeechParam(mTts, mEngineType, mContext, mSharedPreferencesSpeech);
 
    }
    /**
     * 开始合成
     */
    public void startSpeech(String speakContent, OnCompletedListener onCompletedListener) {
        setOnCompletedListener(onCompletedListener);
        int code = mTts.startSpeaking(speakContent, mTtsListener);
//            /**
//             * 只保存音频不进行播放接口,调用此接口请注释startSpeaking接口
//             * text:要合成的文本,uri:需要保存的音频全路径,listener:回调接口
//            */
//            String path = Environment.getExternalStorageDirectory()+"/tts.pcm";
//            int code = mTts.synthesizeToUri(text, path, mTtsListener);
 
        if (code != ErrorCode.SUCCESS) {
            if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) {
               ToastUtil.showToast("没有安装语音+ code = " + code);
            } else {
                ToastUtil.showToast("语音合成失败,错误码: " + code);
            }
        }
 
    }
    /**
     * 开始合成
     */
    public void startSpeech(String speakContent, SynthesizerListener listener) {
 
        int code = mTts.startSpeaking(speakContent, listener);
        //            /**
        //             * 只保存音频不进行播放接口,调用此接口请注释startSpeaking接口
        //             * text:要合成的文本,uri:需要保存的音频全路径,listener:回调接口
        //            */
        //            String path = Environment.getExternalStorageDirectory()+"/tts.pcm";
        //            int code = mTts.synthesizeToUri(text, path, mTtsListener);
 
        if (code != ErrorCode.SUCCESS) {
            if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) {
                ToastUtil.showToast("没有安装语音+ code = " + code);
            } else {
                ToastUtil.showToast("语音合成失败,错误码: " + code);
            }
        }
 
    }
 
    //注册合成完毕后的监听事件
    private OnCompletedListener mOnCompletedListener;
    public void setOnCompletedListener(OnCompletedListener mOnCompletedListener) {
        this.mOnCompletedListener = mOnCompletedListener;
    }
    public interface OnCompletedListener {
        void OnCompleted();
    }
 
    /**
     * 合成回调监听。
     */
    public SynthesizerListener mTtsListener = new SynthesizerListener() {
 
        @Override
        public void onSpeakBegin() {
            Util.LogUtil.i("开始播放");
        }
 
        @Override
        public void onSpeakPaused() {
            Util.LogUtil.i("暂停播放");
        }
 
        @Override
        public void onSpeakResumed() {
            Util.LogUtil.i("继续播放");
        }
 
        @Override
        public void onBufferProgress(int percent, int beginPos, int endPos,
                                     String info) {
            //            ToastUtil.showToast(mContext,String.format(mContext.getString(R.string.tts_toast_format),
        }
 
        @Override
        public void onSpeakProgress(int percent, int beginPos, int endPos) {
            // 播放进度
            mPercentForPlaying = percent;
        }
 
        @Override
        public void onCompleted(SpeechError error) {
            if(mOnCompletedListener!=null)
            mOnCompletedListener.OnCompleted();
            if (error == null) {
            } else if (error != null) {
                ToastUtil.showToast(error.getPlainDescription(true));
            }
        }
 
        @Override
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
            // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
            // 若使用本地能力,会话id为null
            //    if (SpeechEvent.EVENT_SESSION_ID == eventType) {
            //        String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
            //        Log.d(TAG, "session id =" + sid);
            //    }
        }
    };
 
}

2.判断本安卓设备是否下载讯飞语记录,没有就去下载。

//判断本机是否安装了讯飞语记
            if (!SpeechUtility.getUtility().checkServiceInstalled()) {
                //未安装
                String url = SpeechUtility.getUtility().getComponentUrl();
                Uri uri = Uri.parse(url);
                Intent it = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(it);
            }else {
                //已安装,开始合成TODO:
                
            }
     3.语音合成代码。

/**
* 第二个参数如果不想监听说话完毕的状态就传null,想监听就实现这个接口
*/
SampleApplication.getSpeechSynthesizerUtil().startSpeech("说话",this);
三、打开讯飞语记,设置自己喜欢的发音人,设置tts引擎。

通用设置-->语音合成设置-->

————————————————
版权声明:本文为CSDN博主「妄为y」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33402333/article/details/89029681

Android免费离线文字转语言+讯飞语记相关推荐

  1. 谷歌tts android手机自带引擎,Android使用讯飞语记引擎实现中文TTS

    1.首先去讯飞语记官网下载并安装APP: 2.设置语音引擎: 设置==>语言和输入法==>文字转语音(TTS)输出==>首选引擎 3.在代码中使用: import android.c ...

  2. php 腾讯云 文字识别_讯飞语音转文字,图片转文字,效率高还免费

    讯飞语记由科大讯飞出品,是一款专注语音输入的综合类云笔记,支持实时语音听写.会议录音转写,拍照识别.图文编排.智能任务提醒等功能.是您写小说.写日记.采访.会议记录的必备神器! [哪些人在用讯飞语记? ...

  3. android语音输入文字,盘点好用的语音输入APP,懒得打字的时候就说话吧!

    原标题:盘点好用的语音输入APP,懒得打字的时候就说话吧! 本文为「智活范」原创作品,欢迎关注我们! 上次推完好用的录音APP后,立刻就有萌友来问了,能不能直接录音转文字呢,这样说话就能生成文字,多省 ...

  4. Android语音转文字STT(通过第三方程序实现)

    通过第三方程序实现语音转文字功能,如讯飞语音等 首先先检测系统中是否存在支持语音识别功能,如果存在直接启动语音识别,若不存在则引导用户通过应用商店下载讯飞语音助手. 代码如下: /*** 语音助手辅助 ...

  5. Android离线文字转语音(TTS)原生实现

    目前文字转语音用的最多的是第三方厂商科大讯飞,不过需要收费.google也有离线文字转语音sdk,支持中文,发音也很好,使用免费的它不更香么!下边介绍具体使用步骤: 一.下载并设置Google文字转语 ...

  6. Android应用离线中文语音识别PocketSphinx (免费哦~)

    该文章重点在中文语音识别的应用上 目录 前言 一.不太推荐的知名demo 1.官方demo PocketSphinx (https://github.com/cmusphinx/pocketsphin ...

  7. android 离线文字识别开源库 tesseract

    前言 离线文字识别开源库,本文只介绍如何使用 tess-two github地址: https://github.com/rmtheis/tess-two 导入依赖 implementation 'c ...

  8. 集成Android免费语音合成功能(在线、离线、离在线融合)

    集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离线) 集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离在线融合) 转眼间,大半年 ...

  9. 集成Android免费语音合成功能(在线、离线、离在线融合),有这一篇文章就够了(在线)

    集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离线) 集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离在线融合)     转眼间 ...

  10. 集成Android免费语音合成功能(在线、离线、离在线融合),有这一篇文章就够了(离线)

    原址 集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(在线) 集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离在线融合)     ...

最新文章

  1. leetcode算法题--可获得的最大点数
  2. python二十八:模块
  3. 【转】从哈希存储到Bloom Filter
  4. wince导航_宁可用手机导航,也不用汽车导航?
  5. 肖仰华 | 知识图谱与认知智能
  6. android在程序中打开另一个程序
  7. docker $PWD路径_Docker 数据持久化
  8. ABAP字符串的加密与解密
  9. SELECT COUNT用法
  10. 大学计算机基础知识课本,大学计算机基础 教材简介
  11. MAC中安装Navicat Premium
  12. 关于Android图形系统的一些事实真相
  13. java网络编程中Socket什么意思?怎么工作的?
  14. IGRP和EIGRP为什么是距离矢量协议
  15. PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
  16. mysql查询大于0的标记,Mysql计数列大于0
  17. 复现 Oriented R-CNN RTX3080ti
  18. 粒子系统(particle system)
  19. 关于CV_8U和CV_32F
  20. 输出华氏 摄氏度转换表

热门文章

  1. 一首光辉岁月的歌词,送给自己
  2. 基于Matlab的数字水印设计——基于空域的水印处理系统
  3. linux temp文件夹在哪_linux基础知识笔记(第一天)
  4. word2010自动弹出信息检索解决方法
  5. 网络爬虫中Json数据的解析[以时光网为例]
  6. 树状数组的理解以及简单应用
  7. 线性规划问题之案例1(奶制品的生产与销售)
  8. C:编译错误:error: array subscript is not an integer
  9. 2020-10-11
  10. L1-087 机工士姆斯塔迪奥 和 L1-048 矩阵A乘以B