离线语音听写

简介: 离线语音听写 科大离线语音听写需要安装语记(曾用名-语音+),暂时不支持离线包,可能是因为库会比较大。

离线语音听写

科大离线语音听写需要安装语记(曾用名-语音+),暂时不支持离线包,可能是因为库会比较大。

效果图

P0

源码

下载地址:http://download.csdn.net/detail/q4878802/9032149

步骤

1. 开通语音听写服务

2. 下载SDK

  • 选择服务

P1

  • 选择平台

P2

  • 选择应用

P3

3. 集成

准备(安装语记及下载离线资源)

下载语记

1. 在主流应用市场下载语记

2. 科大官网下载

地址: http://www.xfyun.cn/speechservice

P4

点击如果您是用户切换到用户界面然后再点击马上下载

P5

如果再开发者界面点击下载,下载的是SDK

P6

安装以后,在语记里点击能力->识别能力->离线识别资源,把基础资源离线识别都下载下来

P7

到此离线资源准备完成

集成

1. 将SDK里的jar包导入工程

2. 初始化APPID

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

android:name="InitKqwSpeech"

初始化

package com.example.kqwlocalspeechdemo;

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

import android.app.Application;

public class InitKqwSpeech extends Application {

    @Override
    public void onCreate() {
        // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史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(InitKqwSpeech.this, param.toString());

        super.onCreate();
    }
}

3. 语音听写工具类

package com.example.kqwlocalspeechdemo.engine;

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

import com.example.kqwlocalspeechdemo.utils.JsonUtils;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;

public abstract class KqwSpeechRecognizer {
    /**
     * 初始化的回调
     * 
     * @param flag
     *            true 初始化成功 false 初始化失败
     */
    public abstract void initListener(boolean flag);

    public abstract void resultData(String data);

    public abstract void speechLog(String log);

    // 语音听写对象
    private SpeechRecognizer mIat;
    // TAG标签
    private static String TAG = "KqwSpeechRecognizer";
    // 上下文
    private static Context mContext;    

    // SharedPreferences
    // private SharedPreferences mSharedPreferences;

    public KqwSpeechRecognizer(Context context) {
        // 获取上下文
        mContext = context;
        // 初始化识别对象
        mIat = SpeechRecognizer.createRecognizer(context, new InitListener() {

            @Override
            public void onInit(int code) {
                Log.d(TAG, "SpeechRecognizer init() code = " + code);
                if (code != ErrorCode.SUCCESS) {
                    initListener(false);
                    Toast.makeText(mContext, "初始化失败,错误码:" + code, Toast.LENGTH_SHORT).show();
                } else {
                    initListener(true);
                }
            }
        });
    }

    /**
     * 开始录音
     */
    public void startListening() {
        // 设置参数
        setParam();
        // 不显示听写对话框
        int ret = mIat.startListening(recognizerListener);
        if (ret != ErrorCode.SUCCESS) {
            Toast.makeText(mContext, "听写失败,错误码:" + ret, Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 停止录音并获取录入的文字
     */
    public void cancel() {
        if (null != mIat) {
            // mIat.cancel();
            mIat.stopListening();
        }
    }

    /**
     * 听写监听器。
     */
    private RecognizerListener recognizerListener = new RecognizerListener() {

        StringBuffer resultText;

        @Override
        public void onBeginOfSpeech() {
            speechLog("开始说话");
            Log.i(TAG, "开始说话");
            resultText = new StringBuffer();
        }

        @Override
        public void onError(SpeechError error) {
            Log.i(TAG, error.getPlainDescription(true));
        }

        @Override
        public void onEndOfSpeech() {
            speechLog("结束说话");
            Log.i(TAG, "结束说话");
        }

        @Override
        public void onResult(RecognizerResult results, boolean isLast) {
            Log.d(TAG, results.getResultString());
            String text = JsonUtils.parseIatResult(results.getResultString());
            resultText.append(text);
            if (isLast) {
                // 最后的结果
                resultData(resultText.toString().trim());
            }
        }

        @Override
        public void onVolumeChanged(int volume, byte[] data) {
            speechLog("当前正在说话,音量大小:" + volume);
            Log.i(TAG, "当前正在说话,音量大小:" + volume);
        }

        @Override
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
        }

    };

    /**
     * 参数设置
     * 
     * @param param
     * @return
     */
    public void setParam() {
        // 清空参数
        mIat.setParameter(SpeechConstant.PARAMS, null);
        // 设置听写引擎
        mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
        // 设置返回结果格式
        mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
        // 设置语言
        mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
        // 设置语言区域
        mIat.setParameter(SpeechConstant.ACCENT, "zh_cn");
        // 设置语音前端点
        mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
        // 设置语音后端点
        mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
        // 设置标点符号
        mIat.setParameter(SpeechConstant.ASR_PTT, "1");
        // 设置音频保存路径
        // mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH,
        // Environment.getExternalStorageDirectory() + "/iflytek/wavaudio.pcm");
    }
}

4. 工具类

package com.example.kqwlocalspeechdemo.utils;

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;

public class JsonUtils {

    public static String parseIatResult(String json) {
        StringBuffer ret = new StringBuffer();
        try {
            JSONTokener tokener = new JSONTokener(json);
            JSONObject joResult = new JSONObject(tokener);

            JSONArray words = joResult.getJSONArray("ws");
            for (int i = 0; i < words.length(); i++) {
                // 转写结果词,默认使用第一个结果
                JSONArray items = words.getJSONObject(i).getJSONArray("cw");
                JSONObject obj = items.getJSONObject(0);
                ret.append(obj.getString("w"));
                // 如果需要多候选结果,解析数组其他字段
                // for(int j = 0; j < items.length(); j++)
                // {
                // JSONObject obj = items.getJSONObject(j);
                // ret.append(obj.getString("w"));
                // }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret.toString();
    }

}

5. 测试类

package com.example.kqwlocalspeechdemo;

import com.example.kqwlocalspeechdemo.engine.KqwSpeechRecognizer;

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

public class MainActivity extends Activity {

    private TextView mTvResult;
    private TextView mTvLog;
    private KqwSpeechRecognizer mKqwSpeechRecognizer;

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

        mTvResult = (TextView) findViewById(R.id.tv_result);
        mTvLog = (TextView) findViewById(R.id.tv_log);

        // 初始化语音听写识别器
        mKqwSpeechRecognizer = new KqwSpeechRecognizer(this) {

            @Override
            public void speechLog(String log) {
                mTvLog.setText(log);
            }

            @Override
            public void resultData(String data) {
                mTvResult.setText(data);
            }

            @Override
            public void initListener(boolean flag) {
                if(flag){
                    Toast.makeText(MainActivity.this, "初始化成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "初始化失败", Toast.LENGTH_SHORT).show();
                }
            }
        };
    }

    /**
     * 开始识别按钮
     * 
     * @param view
     */
    public void start(View view) {
        mTvResult.setText(null);
        // 开始识别
        mKqwSpeechRecognizer.startListening();
    }
}

6. 页面布局

<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="com.example.kqwlocalspeechdemo.MainActivity" >

    <Button
        android:id="@+id/bt_start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:onClick="start"
        android:text="开始录音" />

    <TextView
        android:id="@+id/tv_log"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/bt_start"
        android:gravity="center"
        android:text="录音信息" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/tv_log" >

        <TextView
            android:id="@+id/tv_result"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="返回结果" />
    </ScrollView>

</RelativeLayout>
相关文章
|
达摩院 Java 大数据
达摩院FunASR实时语音转写服务软件包发布
达摩院FunASR实时语音转写服务软件包发布
855 0
达摩院FunASR实时语音转写服务软件包发布
|
Java 语音技术 开发工具
Android 讯飞离线语音听写/离线语音识别SDK
Android 讯飞离线语音听写/离线语音识别SDK
495 0
Android 讯飞离线语音听写/离线语音识别SDK
|
语音技术 Android开发 开发工具
讯飞离线语音合成(离线资源包)
讯飞离线语音合成(离线资源包) 讯飞的语音合成有三种方式 在线语音合成(免费) 离线使用语记语音合成(免费,需要本地装一个语记App并且下载离线资源) 使用讯飞离线语音包(付费) 这里使用离线资源包实现离线语音合成,因为正式版是要付费的,所以这里使用试用的离线包(35天试用期、3个装机量)。
3717 0
|
21天前
|
安全 CDN
基于surging 如何利用peerjs进行语音视频通话
【9月更文挑战第5天】该内容介绍了如何在基于 Surging 框架的应用中集成 PeerJS 以实现语音视频通话功能。首先需安装 Surging 并引入 PeerJS 库,接着创建 Peer 对象并处理连接事件,然后在 Surging 中创建与 PeerJS 交互的逻辑,最后实现获取媒体设备及建立连接共享媒体流的功能。整个过程需根据具体需求进行调整和优化,并确保通信安全。
42 14
|
4月前
|
人工智能 机器人 Android开发
ChatGPT新增朗读功能,可以语音播报生成结果
【2月更文挑战第15天】ChatGPT新增朗读功能,可以语音播报生成结果
125 1
ChatGPT新增朗读功能,可以语音播报生成结果
|
4月前
|
自然语言处理 监控 语音技术
ModelScope-FunASR支持离线语音转写
【2月更文挑战第19天】ModelScope-FunASR支持离线语音转写
165 1
|
人工智能 自然语言处理 监控
录音转写和AI质检的区别和使用场景
录音转写是将语音或录音转化为文本形式的过程。它通常涉及使用自然语言处理技术和语音识别算法来将音频文件中的语音转换为可读的文本格式。 AI质检是一种利用人工智能技术对客户服务、销售和其他电话中心交互进行自动化评估的过程。通过分析和评估客户和代表之间的通话,AI质检可以提供有关客户体验和代表表现的实时洞察和详细报告。 虽然这两种技术都与电话中心相关,但它们的目的和应用场景不同。录音转写主要用于记录和保存通话内容,以便后续参考和分析。而AI质检则旨在自动化监控和提高客户服务和销售的质量,并提供有关员工表现和客户需求的反馈。 有关系统问题欢迎和博主技术交流。
|
机器学习/深度学习 Linux API
【超简单】之基于PaddleSpeech搭建个人语音听写服务
【超简单】之基于PaddleSpeech搭建个人语音听写服务
917 0
【超简单】之基于PaddleSpeech搭建个人语音听写服务
|
机器学习/深度学习 API 语音技术
基于PaddleSpeech搭建个人语音听写服务
之基于PaddleSpeech搭建个人语音听写服务,顾名思义,是通过PaddleSpeech来搭建语音听写服务的,主要思路如下。 1.录音长度切分 2.录音听写 3.录音文本加标点
522 0
|
机器学习/深度学习 编解码 自然语言处理
AliSSR 语音超分算法:让在线会议语音更明亮更自然
超分让在线会议语音更明亮,在线会议已成为日常工作中较为普遍的沟通交流方式,接入会议的方式也呈现多样化,比如电脑入会、手机入会又或是电话入会。
1231 0
AliSSR 语音超分算法:让在线会议语音更明亮更自然