Android百度语音唤醒(has no license,错误码11002)

背景:1,前段时间做了百度的语音合成,2,后来又做了语音听写,3,现在要做语音唤醒

问题:

语音唤醒的代码,总是提示“has no license”,很是郁闷,明明“语音合成”,“语音听写”都没有毛病的,语音唤醒为啥会出问题呢。

找原因:


官网说,“appId appKey appSecret包名(applicationId)4个必须完全正确,才能自动下载正式授权文件”

所以,一定是这4个位置出现了问题(不要纠结为什么 语音合成,语音听写是正常的)

解决思路:

1,首先尝试了,将官网demo的appId appKey appSecret,applicationId,放进自己项目里,发现语音唤醒可以正常使用;

2,又尝试,将自己项目里的appId appKey appSecret,applicationId,放进官网的项目里,发现语音唤醒 不能正常使用

3,验证了原因:就是自己项目的appId appKey appSecret,applicationId有问题

4,前面讲了,我的语音合成,语音听写都是ok的,所以我坚信我的appId appKey appSecret,applicationId,不会出问题

5,想了一夜,我认为是不是语音合成,语音唤醒,要用2套不同的appId appKey appSecret,于是开始尝试,语音唤醒的appId appKey appSecret又重新用包名建了一个应用,竟然完美解决了。

最终成果:

我将语音唤醒,对话框输入语音,语音唤醒后对话框输入语音,集成在一个界面,代码如下:




/**

* Created by 000098 on 2020/3/22。

* Description 自定义的界面,含:1 - 唤醒功能,2 - 对话框输入功能, 3 - 唤醒后对话框输入功能

*

* @author 000098

*/

public class WakeUpAndSpeechextends AppCompatActivityimplements IStatus {

protected TextViewtxtLog;

    protected Buttonbtn;

    protected Buttonsetting;

    protected TextViewtxtResult;

    protected int textViewLines =0;

    //通用的

    protected Handlerhandler;

    protected MyRecognizermyRecognizer;

    //语音输入对话框的

    private CommonRecogParamsapiParams;

    private DigitalDialogInputinput;

    private ChainRecogListenerchainRecogListener;

    //语音唤醒的

    protected MyWakeupmyWakeup;

    private int status =STATUS_NONE;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        // 通用的

        InFileStream.setContext(this);

        setContentView(R.layout.common_without_setting);

        initView();

        handler =new Handler() {

/*

* @param msg

*/

            @Override

            public void handleMessage(Message msg) {

super.handleMessage(msg);

                handleMsg(msg);

            }

};

        MyLogger.setHandler(handler);

        initPermission();

        IRecogListener recogListener =new MessageStatusRecogListener(handler);

        myRecognizer =new MyRecognizer(this, recogListener);

        //语音输入对话框的

        chainRecogListener =new ChainRecogListener();

        chainRecogListener.addListener(new MessageStatusRecogListener(handler));

        myRecognizer.setEventListener(chainRecogListener); // 替换掉原来的listener

        initApiParams();

        //语音唤醒的

        IWakeupListener wakeupListener1 =new RecogWakeupListener(handler);

        myWakeup =new MyWakeup(this, wakeupListener1);

        IWakeupListener wakeupListener2 =new RecogWakeupListener(handler);

        myWakeup.setEventListener(wakeupListener2); // 替换原来的 listener

    }

public void initApiParams() {

apiParams =new OnlineRecogParams();

        apiParams.initSamplePath(this);

    }

protected MapfetchParams() {

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

        //  上面的获取是为了生成下面的Map, 自己集成时可以忽略

        Map params =apiParams.fetch(sp);

        //  集成时不需要上面的代码,只需要params参数。

        return params;

    }

/**

* 1 - 唤醒功能

*/

    protected void startWakeup() {

Map params =new HashMap();

        params.put(SpeechConstant.WP_WORDS_FILE, "assets:///WakeUp.bin");

        myWakeup.start(params);

    }

protected void startSpeech() {

// 此处params可以打印出来,直接写到你的代码里去,最终的json一致即可。

        final Map params = fetchParams();

        // BaiduASRDigitalDialog的输入参数

        input =new DigitalDialogInput(myRecognizer, chainRecogListener, params);

        BaiduASRDigitalDialog.setInput(input); // 传递input信息,在BaiduASRDialog中读取,

        Intent intent =new Intent(this, BaiduASRDigitalDialog.class);

        startActivityForResult(intent, 2);

    }

/**

* 2 - 对话框输入功能

*/

    protected void startVoice() {

switch (status) {

case STATUS_NONE:// 初始状态

//禁止语音唤醒

                myWakeup.stop();

                //开始录音

                startSpeech();

                status =STATUS_WAITING_READY;

break;

            case STATUS_WAITING_READY:// 调用本类的start方法后,即输入START事件后,等待引擎准备完毕。

            case STATUS_READY:// 引擎准备完毕。

            case STATUS_SPEAKING:// 用户开始讲话

            case STATUS_FINISHED:// 一句话识别语音结束

            case STATUS_RECOGNITION:// 识别中

                stop();

                status =STATUS_STOPPED; // 引擎识别中

                break;

            case STATUS_LONG_SPEECH_FINISHED:// 长语音识别结束

            case STATUS_STOPPED:// 引擎识别中

                cancel();

                status =STATUS_NONE; // 识别结束,回到初始状态

                break;

            default:

break;

        }

}

@Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

Log.e("handleMsg= ", "onActivityResult");

        if (requestCode ==2) {

//停止唤醒

            stop();

            String message ="对话框的识别结果:";

            if (resultCode ==RESULT_OK) {

ArrayList results = data.getStringArrayListExtra("results");

                if (results !=null && results.size() >0) {

String str = results.get(0).toString().replace(",", "");

                    message += str;

                }

}else {

message +="没有结果";

            }

Log.e("handleMsg= ", message);

        }

}

protected void handleMsg(Message msg) {

if (txtLog !=null && msg.obj !=null) {

textViewLines++;

            if (textViewLines >100) {

textViewLines =0;

                txtLog.setText("");

            }

txtLog.append(msg.obj.toString() +"\n");

        }

if (msg.what ==STATUS_WAKEUP_SUCCESS) {

//3 - 唤醒后对话框输入功能

            Log.e("handleMsg", "STATUS_WAKEUP_SUCCESS");

            startSpeech();

return;

        }

switch (msg.what) {// 处理MessageStatusRecogListener中的状态回调

            case STATUS_FINISHED:

if (msg.arg2 ==1) {

Log.e("handleMsg", msg.obj.toString());

                }

status = msg.what;

break;

            case STATUS_NONE:

case STATUS_READY:

case STATUS_SPEAKING:

case STATUS_RECOGNITION:

status = msg.what;

break;

            default:

break;

        }

}

protected void initView() {

txtResult =  findViewById(com.baidu.aip.asrwakeup3.uiasr.R.id.txtResult);

        txtLog =  findViewById(com.baidu.aip.asrwakeup3.uiasr.R.id.txtLog);

        btn =  findViewById(com.baidu.aip.asrwakeup3.uiasr.R.id.btn);

        setting = findViewById(com.baidu.aip.asrwakeup3.uiasr.R.id.setting);

        //

        btn.setOnClickListener(new View.OnClickListener() {

@Override

            public void onClick(View v) {

startVoice();

            }

});

    }

/**

* android 6.0 以上需要动态申请权限

*/

    private void initPermission() {

String[] permissions = {

Manifest.permission.RECORD_AUDIO,

                Manifest.permission.ACCESS_NETWORK_STATE,

                Manifest.permission.INTERNET,

                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以上动态授权的回调,用户自行实现。

    }

/**

* 开始录音后,手动点击“停止”按钮。

* SDK会识别不会再识别停止后的录音。

* 基于DEMO集成4.1 发送停止事件 停止录音

*/

    protected void stop() {

myRecognizer.stop();

        //停止唤醒

        myWakeup.stop();

    }

/**

* 开始录音后,手动点击“取消”按钮。

* SDK会取消本次识别,回到原始状态。

* 基于DEMO集成4.2 发送取消事件 取消本次识别

*/

    protected void cancel() {

myRecognizer.cancel();

        //停止唤醒

        myWakeup.stop();

    }

@Override

    protected void onResume() {

super.onResume();

        //开始唤醒 (如果将此代码注释,则该界面相当于 对话框输入语音界面)

        startWakeup();

    }

@Override

    protected void onDestroy() {

myRecognizer.release();

        //停止唤醒

        myWakeup.release();

        // BluetoothUtil.destory(this); // 蓝牙关闭

        super.onDestroy();

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容