先开启语音识别,正常识别几次以后,再开启唤醒 ,唤醒启动正常,说出唤醒词,唤醒监听中没有任何回调. 如果我先开启唤醒,再开识别就没事
VAD_DNN和唤醒没关系。VAD_DNN是识别时的VAD算法,新版本默认就是DNN
我根据你的代码测试了一下,我每次开启识别前没有设置VAD_DNN这个参数,加上以后,问题解决了. 可是我不明白 VAD_DNN这个参数 和 唤醒不会调 有什么关系 能给解答一下吗
哈哈,好吧 我先测试下,你这个急脾气!
能把问题列下编号么?
先看完代码后测试,有问题再提问:
package com.baidu.android.voicedemo.activity.mini; import android.Manifest; import android.app.Activity; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.baidu.speech.EventListener; import com.baidu.speech.EventManager; import com.baidu.speech.EventManagerFactory; import com.baidu.speech.asr.SpeechConstant; import com.baidu.speech.recognizerdemo.R; import org.json.JSONObject; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; /** * Created by fujiayi on 2017/8/15. */ public class ActivityMiniRecog extends AppCompatActivity implements EventListener { protected TextView txtLog; protected TextView txtResult; protected Button btn; protected Button stopBtn; private static String DESC_TEXT = "精简版识别,带有SDK唤醒运行的最少代码,仅仅展示如何调用,\n" + "也可以用来反馈测试SDK输入参数及输出回调。\n" + "本示例需要自行根据文档填写参数,可以使用之前识别示例中的日志中的参数。\n" + "需要完整版请参见之前的识别示例。\n" + "需要测试离线命令词识别功能可以将本类中的enableOffline改成true,首次测试离线命令词请联网使用。之后请说出“打电话给张三”"; private EventManager asr; private boolean logTime = true; private boolean enableOffline = false; // 测试离线命令词,需要改成true private EventManager wakeup; /** * 测试参数填在这里 */ private void start() { txtLog.setText(""); Map params = new LinkedHashMap(); String event = null; event = SpeechConstant.ASR_START; // 替换成测试的event if (enableOffline){ params.put(SpeechConstant.DECODER, 2); } params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false); // params.put(SpeechConstant.VAD_ENDPOINT_TIMEOUT, 0); //长语音 // params.put(SpeechConstant.NLU, "enable"); // params.put(SpeechConstant.VAD_ENDPOINT_TIMEOUT, 800); // params.put(SpeechConstant.VAD, SpeechConstant.VAD_DNN); // params.put(SpeechConstant.PROP ,20000); // 请先使用如‘在线识别’界面测试和生成识别参数。 params同ActivityRecog类中myRecognizer.start(params); String json = null; //可以替换成自己的json json = new JSONObject(params).toString(); // 这里可以替换成你需要测试的json asr.send(event, json, null, 0, 0); printLog("输入参数:" + json); } private void stop() { asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0); // } private void loadOfflineEngine() { Map params = new LinkedHashMap(); params.put(SpeechConstant.DECODER, 2); params.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, "assets://baidu_speech_grammar.bsg"); asr.send(SpeechConstant.ASR_KWS_LOAD_ENGINE, new JSONObject(params).toString(), null, 0, 0); } private void unloadOfflineEngine() { asr.send(SpeechConstant.ASR_KWS_UNLOAD_ENGINE, null, null, 0, 0); // } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.common_mini); initView(); initPermission(); asr = EventManagerFactory.create(this, "asr"); asr.registerListener(this); // EventListener 中 onEvent方法 btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { start(); } }); stopBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Map params1 = new TreeMap(); params1.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false); params1.put(SpeechConstant.WP_WORDS_FILE, "assets:///WakeUp.bin"); // "assets:///WakeUp.bin" 表示WakeUp.bin文件定义在assets目录下 String json = null; // 这里可以替换成你需要测试的json json = new JSONObject(params1).toString(); wakeup.send(SpeechConstant.WAKEUP_START, json, null, 0, 0); printLog("wakeupStarted"); //stop(); } }); if (enableOffline) { loadOfflineEngine(); //测试离线命令词请开启, 测试 ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH 参数时开启 } wakeup = EventManagerFactory.create(this, "wp"); wakeup.registerListener(this); // EventListener 中 onEvent方法 } @Override protected void onDestroy() { super.onDestroy(); asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0); if (enableOffline) { unloadOfflineEngine(); //测试离线命令词请开启, 测试 ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH 参数时开启 } } // EventListener 回调方法 @Override public void onEvent(String name, String params, byte[] data, int offset, int length) { String logTxt = "name: " + name; if (params != null && !params.isEmpty()) { logTxt += " ;params :" + params; } if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)) { if (params.contains("\"nlu_result\"")) { if (length > 0 && data.length > 0) { logTxt += ", 语义解析结果:" + new String(data, offset, length); } } } else if (data != null) { logTxt += " ;data length=" + data.length; } if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_FINISH)){ } printLog(logTxt); } private void printLog(String text) { if (logTime) { text += " ;time=" + System.currentTimeMillis(); } text += "\n"; Log.i(getClass().getName(), text); txtLog.append(text + "\n"); } private void initView() { txtResult = (TextView) findViewById(R.id.txtResult); txtLog = (TextView) findViewById(R.id.txtLog); btn = (Button) findViewById(R.id.btn); stopBtn = (Button) findViewById(R.id.btn_stop); txtLog.setText(DESC_TEXT + "\n"); } /** * android 6.0 以上需要动态申请权限 */ private void initPermission() { String permissions[] = {Manifest.permission.RECORD_AUDIO, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.INTERNET, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; ArrayList toApplyList = new ArrayList(); for (String perm :permissions){ if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) { toApplyList.add(perm); //进入到这里代表没有权限. } } String tmpList[] = new String[toApplyList.size()]; if (!toApplyList.isEmpty()){ ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // 此处为android 6.0以上动态授权的回调,用户自行实现。 } }
我用到了识别+唤醒+合成, 这样的话识别和唤醒 一个activity会新建两个EventManager 事件管理器 识别的EventManager 和唤醒的EventManager 有影响吗 还是他们两个公用一个EventManager
代码我看了,你这个是识别结束自动开启唤醒, 按你这么来我的也没事
但是,我的问题是 项目里边有识别+唤醒+合成 我先设置参数开启识别 正常重复识别语音3,4次以后, 手动开启唤醒,会没有回调,或者两个唤醒词只有一个可以用 只要不重复开启语音识别,唤醒就正常
我这测试没有问题:修改demo,唤醒词小度你好
package com.baidu.android.voicedemo.activity.mini; import android.Manifest; import android.app.Activity; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.baidu.speech.EventListener; import com.baidu.speech.EventManager; import com.baidu.speech.EventManagerFactory; import com.baidu.speech.asr.SpeechConstant; import com.baidu.speech.recognizerdemo.R; import org.json.JSONObject; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; /** * Created by fujiayi on 2017/8/15. */ public class ActivityMiniRecog extends AppCompatActivity implements EventListener { protected TextView txtLog; protected TextView txtResult; protected Button btn; protected Button stopBtn; private static String DESC_TEXT = "精简版识别,带有SDK唤醒运行的最少代码,仅仅展示如何调用,\n" + "也可以用来反馈测试SDK输入参数及输出回调。\n" + "本示例需要自行根据文档填写参数,可以使用之前识别示例中的日志中的参数。\n" + "需要完整版请参见之前的识别示例。\n" + "需要测试离线命令词识别功能可以将本类中的enableOffline改成true,首次测试离线命令词请联网使用。之后请说出“打电话给张三”"; private EventManager asr; private boolean logTime = true; private boolean enableOffline = true; // 测试离线命令词,需要改成true private EventManager wakeup; /** * 测试参数填在这里 */ private void start() { txtLog.setText(""); Map params = new LinkedHashMap(); String event = null; event = SpeechConstant.ASR_START; // 替换成测试的event if (enableOffline){ params.put(SpeechConstant.DECODER, 2); } params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false); // params.put(SpeechConstant.NLU, "enable"); // params.put(SpeechConstant.VAD_ENDPOINT_TIMEOUT, 800); // params.put(SpeechConstant.VAD, SpeechConstant.VAD_DNN); // params.put(SpeechConstant.PROP ,20000); // 请先使用如‘在线识别’界面测试和生成识别参数。 params同ActivityRecog类中myRecognizer.start(params); String json = null; //可以替换成自己的json json = new JSONObject(params).toString(); // 这里可以替换成你需要测试的json asr.send(event, json, null, 0, 0); printLog("输入参数:" + json); } private void stop() { asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0); // } private void loadOfflineEngine() { Map params = new LinkedHashMap(); params.put(SpeechConstant.DECODER, 2); params.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, "assets://baidu_speech_grammar.bsg"); asr.send(SpeechConstant.ASR_KWS_LOAD_ENGINE, new JSONObject(params).toString(), null, 0, 0); } private void unloadOfflineEngine() { asr.send(SpeechConstant.ASR_KWS_UNLOAD_ENGINE, null, null, 0, 0); // } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.common_mini); initView(); initPermission(); asr = EventManagerFactory.create(this, "asr"); asr.registerListener(this); // EventListener 中 onEvent方法 btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { start(); } }); stopBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stop(); } }); if (enableOffline) { loadOfflineEngine(); //测试离线命令词请开启, 测试 ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH 参数时开启 } wakeup = EventManagerFactory.create(this, "wp"); wakeup.registerListener(this); // EventListener 中 onEvent方法 } @Override protected void onDestroy() { super.onDestroy(); asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0); if (enableOffline) { unloadOfflineEngine(); //测试离线命令词请开启, 测试 ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH 参数时开启 } } // EventListener 回调方法 @Override public void onEvent(String name, String params, byte[] data, int offset, int length) { String logTxt = "name: " + name; if (params != null && !params.isEmpty()) { logTxt += " ;params :" + params; } if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)) { if (params.contains("\"nlu_result\"")) { if (length > 0 && data.length > 0) { logTxt += ", 语义解析结果:" + new String(data, offset, length); } } } else if (data != null) { logTxt += " ;data length=" + data.length; } if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_FINISH)){ Map params1 = new TreeMap(); params1.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false); params1.put(SpeechConstant.WP_WORDS_FILE, "assets:///WakeUp.bin"); // "assets:///WakeUp.bin" 表示WakeUp.bin文件定义在assets目录下 String json = null; // 这里可以替换成你需要测试的json json = new JSONObject(params1).toString(); wakeup.send(SpeechConstant.WAKEUP_START, json, null, 0, 0); printLog("wakeupStarted"); } printLog(logTxt); } private void printLog(String text) { if (logTime) { text += " ;time=" + System.currentTimeMillis(); } text += "\n"; Log.i(getClass().getName(), text); txtLog.append(text + "\n"); } private void initView() { txtResult = (TextView) findViewById(R.id.txtResult); txtLog = (TextView) findViewById(R.id.txtLog); btn = (Button) findViewById(R.id.btn); stopBtn = (Button) findViewById(R.id.btn_stop); txtLog.setText(DESC_TEXT + "\n"); } /** * android 6.0 以上需要动态申请权限 */ private void initPermission() { String permissions[] = {Manifest.permission.RECORD_AUDIO, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.INTERNET, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; ArrayList toApplyList = new ArrayList(); for (String perm :permissions){ if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) { toApplyList.add(perm); //进入到这里代表没有权限. } } String tmpList[] = new String[toApplyList.size()]; if (!toApplyList.isEmpty()){ ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { // 此处为android 6.0以上动态授权的回调,用户自行实现。 } }
试过,不管用
唤醒时前,请您关闭识别看看
Android的
您好 是安卓还是IOS?
VAD_DNN和唤醒没关系。VAD_DNN是识别时的VAD算法,新版本默认就是DNN
我根据你的代码测试了一下,我每次开启识别前没有设置VAD_DNN这个参数,加上以后,问题解决了. 可是我不明白 VAD_DNN这个参数 和 唤醒不会调 有什么关系 能给解答一下吗
哈哈,好吧 我先测试下,你这个急脾气!
能把问题列下编号么?
先看完代码后测试,有问题再提问:
我用到了识别+唤醒+合成, 这样的话识别和唤醒 一个activity会新建两个EventManager 事件管理器 识别的EventManager 和唤醒的EventManager 有影响吗 还是他们两个公用一个EventManager
代码我看了,你这个是识别结束自动开启唤醒, 按你这么来我的也没事
但是,我的问题是 项目里边有识别+唤醒+合成 我先设置参数开启识别 正常重复识别语音3,4次以后, 手动开启唤醒,会没有回调,或者两个唤醒词只有一个可以用 只要不重复开启语音识别,唤醒就正常
我这测试没有问题:修改demo,唤醒词小度你好
试过,不管用
唤醒时前,请您关闭识别看看
Android的
您好 是安卓还是IOS?