科大讯飞语音唤醒(Android)

前面的工程项目配置和语音识别差不多,但是需要从SDK的res文件夹中复制ivw文件夹粘贴到main下面的assets文件夹下面。具体的文件配置结构,我截个图给大家看看:
在这里插入图片描述
剩下的步骤就是两页代码了,附上!
首先是MyApplication中的代码:

public class MyApplication extends Application {

@Override
public void onCreate() {
    initializeIflytek();
    super.onCreate();
}

private void initializeIflytek()
{
    StringBuffer param = new StringBuffer();
    //IflytekAPP_id为我们申请的Appid
    param.append("appid="+getString(R.string.IflytekAPP_id));
    param.append(",");
    // 设置使用v5+
    param.append(SpeechConstant.ENGINE_MODE+"="+ SpeechConstant.MODE_MSC);
    SpeechUtility.createUtility(MyApplication.this, param.toString());
}    
}

然后是MainActivity中的代码:

package com.example.study01;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Environment;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.VoiceWakeuper;
import com.iflytek.cloud.WakeuperListener;
import com.iflytek.cloud.WakeuperResult;
import com.iflytek.cloud.util.ResourceUtil;

import org.json.JSONException;
import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {

//唤醒的阈值,就相当于门限值,当用户输入的语音的置信度大于这一个值的时候,才被认定为成功唤醒。
private int curThresh = 1450;

//是否持续唤醒
private String keep_alive = "1";

private String ivwNetMode = "0";
// 语音唤醒对象
private VoiceWakeuper mIvw;
//存储唤醒词的ID
private String wordID = "";
// 唤醒结果内容
private String resultString;

private TextView tv;

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

    tv=(TextView)findViewById(R.id.tv);


    // 初始化唤醒对象
    mIvw = VoiceWakeuper.createWakeuper(MainActivity.this, null);




    //非空判断,防止因空指针使程序崩溃
    mIvw = VoiceWakeuper.getWakeuper();
    if(mIvw != null) {
        resultString="";
        tv.setText(resultString);
        // 清空参数
        mIvw.setParameter(SpeechConstant.PARAMS, null);
        // 唤醒门限值,根据资源携带的唤醒词个数按照“id:门限;id:门限”的格式传入
        mIvw.setParameter(SpeechConstant.IVW_THRESHOLD, "0:"+ curThresh);
        // 设置唤醒模式
        mIvw.setParameter(SpeechConstant.IVW_SST, "wakeup");
        // 设置持续进行唤醒
        mIvw.setParameter(SpeechConstant.KEEP_ALIVE, keep_alive);
        // 设置闭环优化网络模式
        mIvw.setParameter(SpeechConstant.IVW_NET_MODE, ivwNetMode);
        // 设置唤醒资源路径
        mIvw.setParameter(SpeechConstant.IVW_RES_PATH, getResource());
        // 设置唤醒录音保存路径,保存最近一分钟的音频
        mIvw.setParameter( SpeechConstant.IVW_AUDIO_PATH, Environment.getExternalStorageDirectory().getPath()+"/msc/ivw.wav" );
        mIvw.setParameter( SpeechConstant.AUDIO_FORMAT, "wav" );
        // 如有需要,设置 NOTIFY_RECORD_DATA 以实时通过 onEvent 返回录音音频流字节
        //mIvw.setParameter( SpeechConstant.NOTIFY_RECORD_DATA, "1" );

        // 启动唤醒
        mIvw.startListening(new MyWakeuperListener());
    }else{
        showTip("唤醒未初始化");
    }
}

public void showTip(String str){
    Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();
}


/**
 * 获取唤醒词功能
 * @return 返回文件位置
 */
private String getResource() {
    final String resPath = ResourceUtil.generateResourcePath(MainActivity.this,ResourceUtil.RESOURCE_TYPE.assets, "ivw/"+getString(R.string.IflytekAPP_id)+".jet");
    return resPath;
}


/**
 * 唤醒词监听类
 * @author Administrator
 *
 */
private class MyWakeuperListener implements WakeuperListener {
    //开始说话
    @Override
    public void onBeginOfSpeech() {

    }

    //错误码返回
    @Override
    public void onError(SpeechError arg0) {

    }

    @Override
    public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {

    }

    @Override
    public void onVolumeChanged(int i) {

    }

    @Override
    public void onResult(WakeuperResult result) {

        if (!"1".equalsIgnoreCase(keep_alive)) {
            //setRadioEnable(true);
        }
        try {
            String text = result.getResultString();
            JSONObject object;
            object = new JSONObject(text);
            StringBuffer buffer = new StringBuffer();
            buffer.append("【RAW】 " + text);
            buffer.append("\n");
            buffer.append("【操作类型】" + object.optString("sst"));
            buffer.append("\n");
            buffer.append("【唤醒词id】" + object.optString("id"));
            buffer.append("\n");
            buffer.append("【得分】" + object.optString("score"));
            buffer.append("\n");
            buffer.append("【前端点】" + object.optString("bos"));
            buffer.append("\n");
            buffer.append("【尾端点】" + object.optString("eos"));
            resultString = buffer.toString();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        tv.setText(resultString);
    }
}
}

大差不差应该就是这些了,但是还是怕同学们会出错,比如:appid是啥没有搞清楚,还有返回文件的位置没有弄清楚,细节吧,我这个是简单的实现语音唤醒功能,希望能对大家有所帮助!

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值