android 科大讯飞语音唤醒的使用

这篇博客主要讲解一下科大讯飞的语音唤醒的使用

科大讯飞语音唤醒可以运用到很多场景也是AI的第一步 , 比如叮咚音响 ,智能风扇一些之类的,我之前项目需要做这样的一个需求!然后根据科大讯飞的Dome去集成的!

          那我们现在开始讲该怎么用了 !  前面集成SDK就不说了,网上有很多这种集成的案列 , 或者跟着官网的API去做也可以,我这里主要写一下代码的实现!

代码:

@Override
public void onCreate() {
    StringBuffer param = new StringBuffer();
    param.append("appid=" + getString(R.string.app_id));
    param.append(",");
    // 设置使用v5+
    param.append(SpeechConstant.ENGINE_MODE + "=" + SpeechConstant.MODE_MSC);
    SpeechUtility.createUtility(Global.this, param.toString());
    // 初始化唤醒对象
    mIvw = VoiceWakeuper.createWakeuper(Global.this, null);
    initData();
    super.onCreate();
}

private void initData() {
    //非空判断,防止因空指针使程序崩溃
    mIvw = VoiceWakeuper.getWakeuper();
    if (mIvw != null) {
        // 清空参数
        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(mWakeuperListener);
    } else {
    }
}
/**
 * 唤醒后的回调
 */
private WakeuperListener mWakeuperListener = new WakeuperListener() {
    /**
     * 唤醒完成
     * @param result
     */
    @Override
    public void onResult(WakeuperResult result) {
            //在这里面做你唤醒后的操作
    }

    /**
     *唤醒失败
     * @param error
     */
    @Override
    public void onError(SpeechError error) {

    }

    /**
     * 唤醒开始
     */
    @Override
    public void onBeginOfSpeech() {
    }

    @Override
    public void onEvent(int eventType, int isLast, int arg2, Bundle obj) {
        switch (eventType) {
            // EVENT_RECORD_DATA 事件仅在 NOTIFY_RECORD_DATA 参数值为 真 时返回
            case SpeechEvent.EVENT_RECORD_DATA:
                final byte[] audio = obj.getByteArray(SpeechEvent.KEY_EVENT_RECORD_DATA);
                Log.i(TAG, "ivw audio length: " + audio.length);
                break;
        }
    }

    @Override
    public void onVolumeChanged(int volume) {

    }
};

private String getResource() {
    final String resPath = ResourceUtil.generateResourcePath(Global.this, ResourceUtil.RESOURCE_TYPE.assets, "ivw/" + getString(R.string.app_id) + ".jet");
    Log.d(TAG, "resPath: " + resPath);
    return resPath;
}

/**
 * 唤醒手机屏幕并解锁
 */
public void wakeUpAndUnlock() {
    // 获取电源管理器对象
    PowerManager pm = (PowerManager) Global.this.getSystemService(Context.POWER_SERVICE);
    boolean screenOn = pm.isScreenOn();
    if (!screenOn) {
        // 获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag
        PowerManager.WakeLock wl = pm.newWakeLock(
                PowerManager.ACQUIRE_CAUSES_WAKEUP |
                        PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
        wl.acquire(10000); // 点亮屏幕
        wl.release(); // 释放
    }
    // 屏幕解锁
    KeyguardManager keyguardManager = (KeyguardManager) Global.this.getSystemService(KEYGUARD_SERVICE);
    KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("unLock");
    // 屏幕锁定
    keyguardLock.reenableKeyguard();
    keyguardLock.disableKeyguard(); // 解锁
}
以上就是唤醒的代码实现

如果还有不清楚的可以在下评论,留言!  

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
回答: 在Unity中使用科大讯飞语音的过程中,有一些常见问题需要注意。首先,关于路径的问题,需要确保ivw_res_path路径中不包含中文字符,否则会报错10102。此外,路径中的斜杠需要替换为反斜杠,否则也会报错10102。\[1\] 其次,关于QIVWAudioWrite接口需要调用两次的问题,这是因为在写入音频数据时,需要先调用一次MSP_AUDIO_SAMPLE_CONTINUE表示音频数据的中间部分,然后再调用一次MSP_AUDIO_SAMPLE_LAST表示音频数据的最后一部分。这样做是为了确保音频数据的完整性。\[2\] 最后,关于QIVWRegisterNotify接口后面需要使用Sleep的问题,这是因为在注册通知后,需要给科大讯飞语音一些时间来处理注册的操作。使用Sleep函数可以暂停程序的执行,让科大讯飞语音有足够的时间来完成注册。具体的等待时间可以根据实际情况进行调整。\[2\] 总结起来,在Unity中使用科大讯飞语音时,需要注意路径中不包含中文字符,斜杠需要替换为反斜杠;在写入音频数据时,需要调用两次接口来表示音频数据的中间部分和最后一部分;在注册通知后,需要使用Sleep函数给科大讯飞语音足够的时间来完成注册操作。 #### 引用[.reference_title] - *1* *2* [Unity 科大讯飞语音唤醒](https://blog.csdn.net/weixin_42208093/article/details/107364588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值