讯飞语音——唤醒

article/2025/9/13 3:52:31

讯飞语音唤醒

唤醒功能,顾名思义,通过语音,唤醒服务,做我们想做的事情。

  • 效果图(开启应用后说讯飞语音或者讯飞语点唤醒)

P4

  • 源码下载

地址:http://download.csdn.net/detail/q4878802/9023213

步骤

1. 创建应用,开通服务

地址:http://blog.csdn.net/q4878802/article/details/47762169

2. 下载SDK

我们要使用的是讯飞的付费功能,选择唤醒服务,点击下载以后,会提示没有购买。点击“购买服务
P1

点击购买一会看到付费情况,有项目需要,就必须购买,我们写Demo,讯飞给提供了体验版的SDK,和正式版的没有功能上的区别,但是只能试用35天,装机量只有3个,唤醒词不能改,只有“讯飞语音”和“讯飞语点”两个唤醒词。
P2

3. 解压SDK

assets目录下是一些图片资源文件

doc目录下是一些开发文档

libs目录下是一些jar包和so库

res目录下是语音的资源文件,非常重要

sample目录下是Demo

P3

4. 集成语音唤醒

可以按照开发文档的介绍,一步一步跟着做,实现唤醒功能

地址:http://www.xfyun.cn/doccenter/awd

我个人的习惯是看Demo,开发文档只是做一个参考,我个人感觉这样更直接,开发效率更高。

步骤

1. 将Demo导入IDE,跑起来。
2. 在手机上找到功能的入口,根据一些界面上显示的关键字,找到控件。
3. 根据控件ID,在代码找到对应功能的的代码。
4. 找到功能的核心代码以后,看看当前的方法或者类在哪里有用到,怎么用的,是如何初始化的然后集成到自己的工程里,就OK了。
5. 下载的SDK里给的一些资源不是白给的,是和你的appid对应的,你要将demo的appid换成你自己的appid,资源文件也要拷贝到的你的工程里,才能正常使用。

开发步骤

1. 添加权限

这里用到的唤醒功能不是所有的权限都用到的,具体用到了哪些权限,可以看上面的链接,用到哪写权限就加哪些权限,这个为了快速方便测试,把讯飞用到的权限都加上了。

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 初始化appid

我是将appid的初始化放在的Applicaiton下,具体可以下载源码

// 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史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()); 

3. 工具类

初始化好了以后直接复制工具类就可以用了

package com.example.kqwspeechdemo.engine;
import org.json.JSONException;
import org.json.JSONObject;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.VoiceWakeuper;
import com.iflytek.cloud.WakeuperListener;
import com.iflytek.cloud.WakeuperResult;
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 abstract class KqwWake {/*** 唤醒的回调*/public abstract void kqwWake();// Log标签private static final String TAG = "KqwWake";// 上下文private Context mContext;// 语音唤醒对象private VoiceWakeuper mIvw;/** TODO 设置门限值 : 门限值越低越容易被唤醒,需要自己反复测试,根据不同的使用场景,设置一个比较合适的唤醒门限*/// private final static int MAX = 60;// private final static int MIN = -20;private int curThresh = 40;public KqwWake(Context context) {mContext = context;// 加载识唤醒地资源,resPath为本地识别资源路径StringBuffer param = new StringBuffer();String resPath = ResourceUtil.generateResourcePath(context, RESOURCE_TYPE.assets, "ivw/55d33f09.jet");param.append(ResourceUtil.IVW_RES_PATH + "=" + resPath);param.append("," + ResourceUtil.ENGINE_START + "=" + SpeechConstant.ENG_IVW);boolean ret = SpeechUtility.getUtility().setParameter(ResourceUtil.ENGINE_START, param.toString());if (!ret) {Log.d(TAG, "启动本地引擎失败!");}// 初始化唤醒对象mIvw = VoiceWakeuper.createWakeuper(context, null);};/*** 唤醒*/public void wake() {// 非空判断,防止因空指针使程序崩溃mIvw = VoiceWakeuper.getWakeuper();if (mIvw != null) {// textView.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, "1");mIvw.startListening(mWakeuperListener);} else {Toast.makeText(mContext, "唤醒未初始化", Toast.LENGTH_SHORT).show();}}public void stopWake() {mIvw = VoiceWakeuper.getWakeuper();if (mIvw != null) {mIvw.stopListening();} else {Toast.makeText(mContext, "唤醒未初始化", Toast.LENGTH_SHORT).show();}}String resultString = "";private WakeuperListener mWakeuperListener = new WakeuperListener() {@Overridepublic void onResult(WakeuperResult result) {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();stopWake();kqwWake();} catch (JSONException e) {resultString = "结果解析出错";e.printStackTrace();}}@Overridepublic void onError(SpeechError error) {Log.i(TAG, error.getPlainDescription(true));}@Overridepublic void onBeginOfSpeech() {Log.i(TAG, "开始说话");}@Overridepublic void onEvent(int eventType, int isLast, int arg2, Bundle obj) {}};}

测试类

package com.example.kqwspeechdemo;import com.example.kqwspeechdemo.engine.KqwWake;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity {private TextView mTvLog;private TextView mTvResult;private KqwWake kqwWake;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTvLog = (TextView) findViewById(R.id.tv_log);mTvResult = (TextView) findViewById(R.id.tv_result);kqwWake = new KqwWake(this) {@Overridepublic void kqwWake() {Toast.makeText(MainActivity.this, "Debug:\n唤醒成功", Toast.LENGTH_SHORT).show();// 开启唤醒kqwWake.wake();}};// 开启唤醒kqwWake.wake();}
}

页面布局

<LinearLayout 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:orientation="vertical"tools:context="com.example.kqwspeechdemo.MainActivity" ><TextView
        android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#FF000000"android:gravity="center"android:padding="10dp"android:text="唤醒词:讯飞语音、讯飞语点"android:textColor="#FFFFFFFF"android:textSize="20dp" /><View
        android:layout_width="match_parent"android:layout_height="1dp"android:background="#FFFFFFFF" /><TextView
        android:id="@+id/tv_log"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#FF000000"android:gravity="center"android:padding="10dp"android:text="录音信息"android:textColor="#FFFFFFFF"android:textSize="10dp" /><View
        android:layout_width="match_parent"android:layout_height="1dp"android:background="#FFFFFFFF" /><TextView
        android:id="@+id/tv_result"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#FF000000"android:padding="10dp"android:text="返回结果"android:textColor="#FFFFFFFF"android:textSize="10dp" /></LinearLayout>

注意

  1. 如果你直接用我的Demo,我用的是测试版的离线包,只有35天的试用期,而且装机量只有3个,如果大家都用,很可能是不能正常运行的
  2. 如果是参考我的demo自己写一个,千万不要忘记替换appid和资源文件。

http://chatgpt.dhexx.cn/article/nbvZrL22.shtml

相关文章

说话就能轻松操控,科大讯飞语音唤醒技术带来便利体验!

如果&#xff0c;紧箍咒失灵了&#xff0c;孙悟空还会听唐僧的话吗&#xff1f; 如果&#xff0c;专注驾驶途中&#xff0c;一声呼唤便可响应需求是否很方便&#xff1f; 如果&#xff0c;手机落在卧室的某个角落&#xff0c;轻轻唤醒便能找到是否心情舒畅&#xff1f; 现实生…

Android——百度语音唤醒

这篇文章我们主要介绍一下,百度语音唤醒。所谓语音唤醒是指说出指定的语音指令(自定义的唤醒词),使程序激活某个功能的能力。百度语音唤醒支持自定义唤醒词。我做过讯飞的语音唤醒,这两个比较起来,讯飞的语音唤醒整体效果比百度要好。百度的语音唤醒功能需要使用唤醒词评…

androidstudio的语音唤醒功能

Manifest配置 写在application之外 <uses-permission android:name"android.permission.RECORD_AUDIO" /><uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name"android.permiss…

国内那几家语音唤醒技术做的比较好? 语音唤醒技术哪家强?

编辑导语&#xff1a; 随着语音交互技术的日渐成熟&#xff0c;越来越多的智能硬件都选择增加语音能力作为产品卖点之一。但是&#xff0c;设备在进入语音交互工作状态的时候&#xff0c;需要先进行唤醒操作。 常见的唤醒语音交互的操作有按键或者触屏形式&#xff0c;但是&…

语音唤醒工具:WeKWS

1 简介 本文根据2022年10月《WEKWS: A PRODUCTION FIRST SMALL-FOOTPRINT END-TO-END KEYWORD SPOTTING TOOLKIT 》翻译总结的。作者为西北工业大学航海学院张晓雷老师团队、西工大音频语音与语言处理研究组谢磊老师团队、WeNet 开源社区等。 WeKWS是一个可以投入生产使用、容…

讯飞语音开发之语音唤醒

只有前面讲到的语音合成&#xff0c;语音理解&#xff0c;语义理解&#xff0c;语音识别确实可以实现人机交流。但是还不能实现完全智能&#xff0c;不能狗做到实时问道&#xff0c;间歇式问答。要实现实时问答&#xff0c;切不用手动操作。这时候语音唤醒功能就大选伸手了。下…

百度语音唤醒

一&#xff1a;前期准工作 &#xff08;1&#xff09;进入百度开放平台&#xff0c;注册账号&#xff0c;创建应用&#xff0c;拿到应用相对应的 AppID&#xff0c;API密钥&#xff0c;密钥 &#xff08;2&#xff09;配置相关信息 <uses-permission android:name"an…

语音唤醒原理

百度语音唤醒时的日志 D/audio_hw_primary: adev_open_input_stream is_karaoke_fastcapture0 D/audio_hw_primary: adev_open_input_stream: enter: sample_rate(16000) channel_mask(0x10) devices(0x80000004) stream_handle(0xf3439a00) io_handle(454) source(1) …

语音唤醒功能篇

语音唤醒功能 语音唤醒使得系统中的各个功能模块能够很好的分隔开来。用户通过唤醒词“依米”唤醒系统&#xff0c;发送语音指令&#xff0c;系统检测到语音指令中的关键词&#xff0c;然后去执行相对应的功能。当系统执行完成后&#xff0c;便进入等待下一次被唤醒状态&#…

语音唤醒

语音唤醒 前言一、语音唤醒相关环境搭建二、使用步骤1.使用流程2.示例代码 总结 前言 针对语音交互过程&#xff0c;提供了一种语音唤醒的方法供大家参考&#xff0c;语音交互采用snowboy离线语音唤醒引擎&#xff0c;snowboy已经被kitt.AI团队下架&#xff0c;但我们仍能够在…

语音唤醒简单说明

随着 Echo 出现,all in one 音响类产品雏形开始显现,语音交互成为最直接的控制方式,Amazon Echo作为最佳代表,智能语音交互成为互联网入口的新价值所在。ABI Research 在 2017 年収布的预测报告指出,估计到 2022 年,支持语音控制的装置出货量将达到 7500万台,其中智能喇…

语音唤醒技术的原理是什么?

https://www.toutiao.com/a6644766450860950024/ 2019-01-10 15:27:29 “天猫精灵。”“哎&#xff0c;在的&#xff0c;你说” “小爱同学&#xff0c;定明天早上8点的闹钟。”“好的&#xff0c;已经帮你定好明天早上8点的闹钟” 不少同学家里都有AI智能音箱产品&#xff0…

android系统看片软件,真正的手机看片神器 和视界手机APP评测

播放界面支持丰富的手势操作&#xff0c;我们可以通过上下左右的滑动手指来调整影片进度以及音量大小。和视界还可以选择不同的输出设备——只要硬件设备支持&#xff0c;我们可以通过手机将和视界中的视频内容投射到电视上观看。 注重影片的口碑效应&#xff0c;支持用户打分与…

FreeRTOS时间片调度

一、FreeRTOS时间片调度概述 FreeRTOS支持多个任务同时拥有一个优先级&#xff0c;这些任务的调度就可以使用时间片来进行调度。在FreeRTOS中允许一个任务允许一个时间片&#xff08;一个时钟节拍的长度&#xff09;后让出CPU的使用权&#xff0c;让拥有同优先级的下个任务运行…

MongoDB 分片集群技术

在了解分片集群之前&#xff0c;务必要先了解复制集技术&#xff01; 1.1 MongoDB复制集简介 一组Mongodb复制集&#xff0c;就是一组mongod进程&#xff0c;这些进程维护同一个数据集合。复制集提供了数据冗余和高等级的可靠性&#xff0c;这是生产部署的基础。 1.1.1 复制集的…

片偏移怎么计算_计算机网络学习笔记(四)之网络层

点击蓝字关注我吧 越努力越幸运!!! 1 网络层的功能 1.1异构网络互联 网络的互联:指将两个以上的计算机网络,通过一定的方法, 用一种或多种通信处理设备(即中间设备)相互联接起来,以构成更大的网络系统。中间设备又称为中间系统或中继系统。根据中继系统所在…

IP分片浅析

一、IP分片原理 IP分片是网络上传输IP报文的一种技术手段。 IP协议在传输数据包时&#xff0c;将数据报文分为若干分片进行传输&#xff0c;并在目标系统中进行重组。 不同的链路类型规定有不同最大长度的链路层数据帧&#xff0c;称为链路层MTU&#xff08;最大传输单元&#…

硅钢片知识点

文章目录 一、电工钢为什么选硅钢二、为什么要用硅钢“片”三、为什么电机用无取向&#xff0c;变压器用有取向硅钢片四、其他关于硅钢片应该了解的4.1 热轧和冷轧4.2 厚度4.3 牌号4.4 叠片系数4.5 冲片性 一、电工钢为什么选硅钢 电机和变压器的内部主要组成是铜绕组&#xf…

wireshark捕获IP分片数据包实践

一 简介 如果一个数据包超过1500个字节&#xff0c;就需要将该包进行分片发送。通常情况下&#xff0c;是不会出现这种情况的。 下面通过使用ICMP包&#xff0c;来产生IP分片数据包。 使用ICMP包进行测试时&#xff0c;如果不指定包的大小&#xff0c;可能无法查看被分片的数据…

mongo分片

分片 在Mongodb里面存在另一种集群&#xff0c;就是分片技术,可以满足MongoDB数据量大量增长的需求。 当MongoDB存储海量的数据时&#xff0c;一台机器可能不足以存储数据&#xff0c;也可能不足以提供可接受的读写吞吐量。这时&#xff0c;我们就可以通过在多台机器上分割数据…