讯飞离线语音合成(离线资源包)

讯飞离线语音合成(离线资源包)

讯飞的语音合成有三种方式

  1. 在线语音合成(免费)
  2. 离线使用语记语音合成(免费,需要本地装一个语记App并且下载离线资源)
  3. 使用讯飞离线语音包(付费)

这里使用离线资源包实现离线语音合成,因为正式版是要付费的,所以这里使用试用的离线包(35天试用期、3个装机量)。

效果图

源码

下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9063779

开通服务,下载SDK

之前已经介绍过,地址:http://blog.csdn.net/q4878802/article/details/47762169#t8

将SDK里提供的jar包、so库、离线资源都拷贝到我们的工程(Android Studio工程)

创建的工程默认可能没有jniLibs和assets目录,我们要自己在main下创建这两个目录

初始化

在清单文件中application标签下添加name属性

android:name=".InitApplication"

初始化

package com.example.kongqw.kqwspeechcompounddemo;

import android.app.Application;
import android.widget.Toast;

import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechUtility;

/**
 * Created by kongqw on 2015/8/29.
 */
public class InitApplication extends Application {
    @Override
    public void onCreate() {
        Toast.makeText(this, "InitApplication", Toast.LENGTH_LONG).show();
        // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null
        // 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton
        // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true"
        // 参数间使用“,”分隔。
        // 设置你申请的应用appid
        StringBuffer param = new StringBuffer();
        param.append("appid=55d33f09");
        param.append(",");
        param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC);
        // param.append(",");
        // param.append(SpeechConstant.FORCE_LOGIN + "=true");
        SpeechUtility.createUtility(InitApplication.this, param.toString());

        super.onCreate();
    }
}

语音合成工具类

package com.example.kongqw.kqwspeechcompounddemo.engine;

import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SynthesizerListener;
import com.iflytek.cloud.util.ResourceUtil;
import com.iflytek.cloud.util.ResourceUtil.RESOURCE_TYPE;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

/**
 * 语音合成器
 *
 * @author kongqw
 */
public class KqwSpeechSynthesizer {

    // Log标签
    private static final String TAG = "KqwSpeechSynthesizer";

    private Context mContext;

    // 语音合成对象
    private SpeechSynthesizer mTts;

    public KqwSpeechSynthesizer(Context context) {
        mContext = context;
        // 初始化合成对象
        mTts = SpeechSynthesizer.createSynthesizer(context, new InitListener() {
            @Override
            public void onInit(int code) {
                Log.d(TAG, "InitListener init() code = " + code);
                if (code != ErrorCode.SUCCESS) {
                    Toast.makeText(mContext, "初始化失败,错误码:" + code, Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

    /**
     * 开始语音合成
     *
     * @param text
     */
    public void start(String text) {
        // 设置参数
        setParam();
        int code = mTts.startSpeaking(text, mTtsListener);
        if (code != ErrorCode.SUCCESS) {
            Toast.makeText(mContext, "语音合成失败,错误码: " + code, Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 合成回调监听。
     */
    private SynthesizerListener mTtsListener = new SynthesizerListener() {
        @Override
        public void onSpeakBegin() {
            Log.i(TAG, "开始合成");
        }

        @Override
        public void onSpeakPaused() {
            Log.i(TAG, "暂停合成");
        }

        @Override
        public void onSpeakResumed() {
            Log.i(TAG, "继续合成");
        }

        @Override
        public void onBufferProgress(int percent, int beginPos, int endPos, String info) {
            Log.i(TAG, "传冲进度 :" + percent);
        }

        @Override
        public void onSpeakProgress(int percent, int beginPos, int endPos) {
            Log.i(TAG, "合成进度 : " + percent);
        }

        @Override
        public void onCompleted(SpeechError error) {
            if (error == null) {
                Log.i(TAG, "合成完成");
            } else if (error != null) {
                Log.i(TAG, "error : " + error.toString());
            }
        }

        @Override
        public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
            // TODO Auto-generated method stub

        }
    };

    /**
     * 参数设置
     *
     * @return
     */
    private void setParam() {
        // 清空参数
        mTts.setParameter(SpeechConstant.PARAMS, null);
        // 设置使用本地引擎
        mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);
        // 设置发音人资源路径
        mTts.setParameter(ResourceUtil.TTS_RES_PATH, getResourcePath());
        // 设置发音人
        mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");

        // 设置语速
        mTts.setParameter(SpeechConstant.SPEED, "50");

        // 设置音调
        mTts.setParameter(SpeechConstant.PITCH, "50");

        // 设置音量
        mTts.setParameter(SpeechConstant.VOLUME, "50");

        // 设置播放器音频流类型
        mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
    }

    // 获取发音人资源路径
    private String getResourcePath() {
        StringBuffer tempBuffer = new StringBuffer();
        // 合成通用资源
        tempBuffer.append(ResourceUtil.generateResourcePath(mContext, RESOURCE_TYPE.assets, "tts/common.jet"));
        tempBuffer.append(";");
        // 发音人资源
        tempBuffer.append(ResourceUtil.generateResourcePath(mContext, RESOURCE_TYPE.assets, "tts/xiaoyan.jet"));
        return tempBuffer.toString();
    }

}

测试类

package com.example.kongqw.kqwspeechcompounddemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.example.kongqw.kqwspeechcompounddemo.engine.KqwSpeechSynthesizer;

public class MainActivity extends Activity {

    private EditText mEtText;
    private KqwSpeechSynthesizer mKqwSpeechSynthesizer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mEtText = (EditText) findViewById(R.id.et_text);

        // 初始化语音合成对象
        mKqwSpeechSynthesizer = new KqwSpeechSynthesizer(this);
    }

    /**
     * 开始合成
     *
     * @param view
     */
    public void start(View view) {
        Toast.makeText(this, "开始合成 : " + mEtText.getText().toString().trim(), Toast.LENGTH_SHORT).show();
        mKqwSpeechSynthesizer.start(mEtText.getText().toString().trim());
    }
}

XML页面布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="语音合成的内容"
        android:textSize="20dp" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/et_text"
        android:gravity="center"
        android:onClick="start"
        android:text="语音合成"
        android:textSize="20dp" />

</RelativeLayout>

说明

因为我用的是离线资源包,试用期是有35天并且只有3个装机量,所以如果直接使用我的demo可能会有问题,如果要自己再创建一个工程,千万不要忘记替换APPID、库、离线资源。

版权声明:本文为博主原创文章,未经博主允许不得转载。所有文章,任何一个技术点,无论是原创还是转载,都是在程序中使用过或者Demo测试过才发表!博主QQ:4878802。

时间: 2024-10-03 21:41:50

讯飞离线语音合成(离线资源包)的相关文章

讯飞在线语音合成

讯飞在线语音合成 效果图 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9062261 下载SDK 1. 选择服务 2. 选择平台 3. 选择应用 4. 下载SDK 说明 之前的工程都是在Eclipse下演示的,随着Android Studio的普及,我这里也开始使用Android Studio写Demo,虽然细节导入jar包和so库的过程可能不太一样,但是整体的流程是一样的. 将jar包和so库导入Andr

android 讯飞语音识别(离线)注意事项

讯飞语音识别:使用注意事项:mainfest.xml中一定要记得权限写进去21001:我的情况是没有写SpeechApp类,并且需要在application中注册:20005:无匹配结果23300:本地引擎错误,,我的问题是在于语法错误,少了一个分号,,,尼玛,调试好久才找到,而且不会有提示. 一般情况下引擎错误的原因: 1.java代码检查你的语法文件路径.语法ID等相关配置: 2.语法文件语法是否正确,可能多了分号,少了分号,等等,必须严格按照BNF语法(最常出现):

讯飞离线语音合成(语记|语音+)

讯飞离线语音合成(语记|语音+) 讯飞的语音合成有三种方式 在线语音合成(免费) 离线使用语记语音合成(免费,需要本地装一个语记App并且下载离线资源) 使用讯飞离线语音包(付费) 这里使用语记实现离线语音合成 效果图 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9063593 说明 使用语记实现离线语音合成和在线语音合成的步骤非常相似,下载SDK的方式是一样的,一样是选择在线语音合成,只不过是使用离线引擎

破局与进阶,科大讯飞的新武器“讯飞阅读”

深耕技术,沉淀场景,迭代产品,科大讯飞逐步展现着破局与进阶的AI魄力. "讯飞阅读"--一个能快速.便捷.完美复刻你声音的平台,是有声小说阅读神器,科大讯飞的新武器. 如果说2015年是人工智能的概念年,2016年是其蛰伏期,那么2017和2018必然是人工智能的落地元年. 近日,科大讯飞的半年报逐渐被披露,企业上半年营收32.1亿,同比增长了52.68%,毛利16.02亿,同比增长了56.02%. 稳中有升的毛利率中,这家人工智能的龙头企业逐步展现着自己极强的竞争力. 深耕技术,沉淀

基于讯飞语音API应用开发之——离线词典构建

最近实习在做一个跟语音相关的项目,就在度娘上搜索了很多关于语音的API,顺藤摸瓜找到了科大讯飞,虽然度娘自家也有语音识别.语义理解这块,但感觉应该不是很好用,毕竟之前用过百度地图的API,有问题也找不到人帮忙解决(地图开发者群里都是潜水的)...不得不说,科大讯飞在语音这块尤其是中文识别方面做的真心不错,而且Android还支持离线识别. 讯飞官方给的文档内容很详细,在这我就不赘述了.在开发中,由于一些原因需要用到离线识别这块,就学习了一下.讯飞离线识别只支持Android系统,使用时需要安装讯

讯飞语音——离线命令词识别

离线命令词识别 效果图 示例源码 地址:http://download.csdn.net/detail/q4878802/9023825 步骤: 1. 下载SDK 前面文章有,就不在复述了.这里要选择离线命令词的服务以后,重新加载,因为需要下载离线命令词识别的资源文件 地址:http://blog.csdn.net/q4878802/article/details/47762169 2. 集成方法 前面文章有,就不在复述了. 地址:http://blog.csdn.net/q4878802/ar

讯飞离线命令词

1.下载讯飞语音离线命令词功能sdk 2.运行讯飞离线命令词demo 可能出现的问题: 1.app_id没有填写正确导致,创建SpeechRecognize 对象时得到null 和 构建 grammar 2.sdk与资源文件不一致,在语法构建时会出现,服务未授权 3.新建一个项目,将demo添加在里面演示,能正常进行离线语音和离线命令词的功能使用 新建一个项目,将demo中的lib和资源添加到新项目,编写离线命令词代码,能正常使用离线语音和离线命令词功能 将 lib 和 资源  和功能代码集成到

初探科大讯飞-讯飞开放平台之语音合成

1:讯飞开放平台提供了很多服务,有语音相关的:离线,在线语音合成及识别:人机交互:有模式识别相关的:人脸识别,声纹识别:还要云存储等等,如有兴趣,自行百度. 2:看了下官方SDK,试着体验下.导入两个jar包到lib目录,以及两个dll和so文件放到工程根目录. 本次先体验下语音合成模块. 语音合成主要涉及一个类,如下,完成语音的合成 import com.iflytek.cloud.speech.SpeechConstant; import com.iflytek.cloud.speech.S

C#调用科大讯飞离线语音合成TTS

c#调用科大讯飞的离线语音合成,需要在科大讯飞开放平台:http://www.xfyun.cn 注册.创建应用(获取APPID).开通离线语音服务.下载SDK. SDK中目录如下: 关于目录结构,讯飞平台的资料库中有介绍. bin目录下有msc.dll动态库.c#调用科大讯飞的语音合成,需要引用该文件.该文件是C语言生成的dll,C#没办法直接引用.所有需要用C#重新封装一个TTS.dll,然后再在C#项目中引用封装的TTS.dll. 步骤: 1.在VS中新建一个类库项目(TTS),新建一个类文