ex

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
TMBOY
Date:
Tue Jul 18 16:34:48 2017 +0800
Revision:
45:2aa9f933c8d2
?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TMBOY 45:2aa9f933c8d2 1 /*
TMBOY 45:2aa9f933c8d2 2 * *
TMBOY 45:2aa9f933c8d2 3 * Copyright (c) 2017 Baidu, Inc. All Rights Reserved.
TMBOY 45:2aa9f933c8d2 4 *
TMBOY 45:2aa9f933c8d2 5 * Licensed under the Apache License, Version 2.0 (the "License");
TMBOY 45:2aa9f933c8d2 6 * you may not use this file except in compliance with the License.
TMBOY 45:2aa9f933c8d2 7 * You may obtain a copy of the License at
TMBOY 45:2aa9f933c8d2 8 *
TMBOY 45:2aa9f933c8d2 9 * http://www.apache.org/licenses/LICENSE-2.0
TMBOY 45:2aa9f933c8d2 10 *
TMBOY 45:2aa9f933c8d2 11 * Unless required by applicable law or agreed to in writing, software
TMBOY 45:2aa9f933c8d2 12 * distributed under the License is distributed on an "AS IS" BASIS,
TMBOY 45:2aa9f933c8d2 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
TMBOY 45:2aa9f933c8d2 14 * See the License for the specific language governing permissions and
TMBOY 45:2aa9f933c8d2 15 * limitations under the License.
TMBOY 45:2aa9f933c8d2 16 */
TMBOY 45:2aa9f933c8d2 17 package com.baidu.duer.dcs.androidsystemimpl.wakeup;
TMBOY 45:2aa9f933c8d2 18
TMBOY 45:2aa9f933c8d2 19 import android.content.Context;
TMBOY 45:2aa9f933c8d2 20 import android.os.Handler;
TMBOY 45:2aa9f933c8d2 21
TMBOY 45:2aa9f933c8d2 22 import com.baidu.duer.dcs.systeminterface.IWakeUp;
TMBOY 45:2aa9f933c8d2 23 import com.baidu.duer.dcs.util.LogUtil;
TMBOY 45:2aa9f933c8d2 24
TMBOY 45:2aa9f933c8d2 25 import java.io.File;
TMBOY 45:2aa9f933c8d2 26 import java.util.Collections;
TMBOY 45:2aa9f933c8d2 27 import java.util.LinkedList;
TMBOY 45:2aa9f933c8d2 28 import java.util.List;
TMBOY 45:2aa9f933c8d2 29 import java.util.concurrent.LinkedBlockingDeque;
TMBOY 45:2aa9f933c8d2 30
TMBOY 45:2aa9f933c8d2 31 /**
TMBOY 45:2aa9f933c8d2 32 * 唤醒模块-android中实现
TMBOY 45:2aa9f933c8d2 33 * <p>
TMBOY 45:2aa9f933c8d2 34 * Created by guxiuzhong@baidu.com on 2017/6/25.
TMBOY 45:2aa9f933c8d2 35 */
TMBOY 45:2aa9f933c8d2 36 public class WakeUpImpl implements IWakeUp {
TMBOY 45:2aa9f933c8d2 37 private static final String TAG = WakeUpImpl.class.getSimpleName();
TMBOY 45:2aa9f933c8d2 38 // 初始化唤醒词成功
TMBOY 45:2aa9f933c8d2 39 private static final int WAKEUP_INIT_SUCCEED = 0;
TMBOY 45:2aa9f933c8d2 40 // 唤醒词
TMBOY 45:2aa9f933c8d2 41 private static final String WAKEUP_WORD = "小度小度";
TMBOY 45:2aa9f933c8d2 42 // 唤醒词声学模型模型文件
TMBOY 45:2aa9f933c8d2 43 private static final String WAKEUP_FILENAME = "libbdEasrS1MergeNormal.so";
TMBOY 45:2aa9f933c8d2 44 // jni
TMBOY 45:2aa9f933c8d2 45 private WakeUpNative wakeUpNative;
TMBOY 45:2aa9f933c8d2 46 // Decode消费线程
TMBOY 45:2aa9f933c8d2 47 private WakeUpDecodeThread wakeUpDecodeThread;
TMBOY 45:2aa9f933c8d2 48 // callback
TMBOY 45:2aa9f933c8d2 49 private List<IWakeUpListener> wakeUpListeners;
TMBOY 45:2aa9f933c8d2 50 private Handler handler = new Handler();
TMBOY 45:2aa9f933c8d2 51 // 音频数据
TMBOY 45:2aa9f933c8d2 52 private LinkedBlockingDeque<byte[]> linkedBlockingDeque;
TMBOY 45:2aa9f933c8d2 53 // 初始化唤醒词的返回值
TMBOY 45:2aa9f933c8d2 54 private int wakeUpInitialRet;
TMBOY 45:2aa9f933c8d2 55 private Context context;
TMBOY 45:2aa9f933c8d2 56
TMBOY 45:2aa9f933c8d2 57 public WakeUpImpl(Context context, LinkedBlockingDeque<byte[]> linkedBlockingDeque) {
TMBOY 45:2aa9f933c8d2 58 this.linkedBlockingDeque = linkedBlockingDeque;
TMBOY 45:2aa9f933c8d2 59 this.context = context.getApplicationContext();
TMBOY 45:2aa9f933c8d2 60 this.wakeUpNative = new WakeUpNative();
TMBOY 45:2aa9f933c8d2 61 this.wakeUpListeners = Collections.synchronizedList(new LinkedList<IWakeUpListener>());
TMBOY 45:2aa9f933c8d2 62 this.initWakeUp();
TMBOY 45:2aa9f933c8d2 63 }
TMBOY 45:2aa9f933c8d2 64
TMBOY 45:2aa9f933c8d2 65 private void initWakeUp() {
TMBOY 45:2aa9f933c8d2 66 // 方法1:加载声学模型文件,当作so库进行加载到nativeLibraryDir目录中
TMBOY 45:2aa9f933c8d2 67 // 方法2:当然你也可以放到assets目录或者raw下,然后进行拷贝到应用的私有目录或者sd卡
TMBOY 45:2aa9f933c8d2 68 // 方法2需要处理声学模型文件覆盖安装问题,以及不可预料的拷贝失败问题!
TMBOY 45:2aa9f933c8d2 69 String path = this.context.getApplicationInfo().nativeLibraryDir
TMBOY 45:2aa9f933c8d2 70 + File.separatorChar + WAKEUP_FILENAME;
TMBOY 45:2aa9f933c8d2 71 LogUtil.d(TAG, "wakeup path:" + path);
TMBOY 45:2aa9f933c8d2 72 LogUtil.d(TAG, "wakeup exists:" + new File(path).exists());
TMBOY 45:2aa9f933c8d2 73 // 1.初始化唤醒词,0 是初始化成功
TMBOY 45:2aa9f933c8d2 74 wakeUpInitialRet = wakeUpNative.wakeUpInitial(WAKEUP_WORD, path, 0);
TMBOY 45:2aa9f933c8d2 75 LogUtil.d(TAG, "wakeUpInitialRet:" + wakeUpInitialRet);
TMBOY 45:2aa9f933c8d2 76 }
TMBOY 45:2aa9f933c8d2 77
TMBOY 45:2aa9f933c8d2 78 @Override
TMBOY 45:2aa9f933c8d2 79 public void startWakeUp() {
TMBOY 45:2aa9f933c8d2 80 if (wakeUpDecodeThread != null && wakeUpDecodeThread.isStart()) {
TMBOY 45:2aa9f933c8d2 81 LogUtil.d(TAG, "wakeup wakeUpDecodeThread is Started !");
TMBOY 45:2aa9f933c8d2 82 return;
TMBOY 45:2aa9f933c8d2 83 }
TMBOY 45:2aa9f933c8d2 84 // 2.开始唤醒
TMBOY 45:2aa9f933c8d2 85 if (wakeUpInitialRet == WAKEUP_INIT_SUCCEED) {
TMBOY 45:2aa9f933c8d2 86 wakeUp();
TMBOY 45:2aa9f933c8d2 87 } else {
TMBOY 45:2aa9f933c8d2 88 LogUtil.d(TAG, "wakeup wakeUpInitialRet failed, not startWakeUp ");
TMBOY 45:2aa9f933c8d2 89 }
TMBOY 45:2aa9f933c8d2 90 }
TMBOY 45:2aa9f933c8d2 91
TMBOY 45:2aa9f933c8d2 92 @Override
TMBOY 45:2aa9f933c8d2 93 public void stopWakeUp() {
TMBOY 45:2aa9f933c8d2 94 if (wakeUpDecodeThread != null) {
TMBOY 45:2aa9f933c8d2 95 wakeUpDecodeThread.stopWakeUp();
TMBOY 45:2aa9f933c8d2 96 }
TMBOY 45:2aa9f933c8d2 97 handler.removeCallbacksAndMessages(null);
TMBOY 45:2aa9f933c8d2 98 }
TMBOY 45:2aa9f933c8d2 99
TMBOY 45:2aa9f933c8d2 100 @Override
TMBOY 45:2aa9f933c8d2 101 public void releaseWakeUp() {
TMBOY 45:2aa9f933c8d2 102 // 3.释放资源
TMBOY 45:2aa9f933c8d2 103 int ret = wakeUpNative.wakeUpFree();
TMBOY 45:2aa9f933c8d2 104 LogUtil.d(TAG, "wakeUpFree-ret:" + ret);
TMBOY 45:2aa9f933c8d2 105 }
TMBOY 45:2aa9f933c8d2 106
TMBOY 45:2aa9f933c8d2 107 @Override
TMBOY 45:2aa9f933c8d2 108 public void addWakeUpListener(IWakeUpListener listener) {
TMBOY 45:2aa9f933c8d2 109 wakeUpListeners.add(listener);
TMBOY 45:2aa9f933c8d2 110 }
TMBOY 45:2aa9f933c8d2 111
TMBOY 45:2aa9f933c8d2 112 /**
TMBOY 45:2aa9f933c8d2 113 * 开始音频解码进行唤醒操作
TMBOY 45:2aa9f933c8d2 114 */
TMBOY 45:2aa9f933c8d2 115 private void wakeUp() {
TMBOY 45:2aa9f933c8d2 116 wakeUpDecodeThread = new WakeUpDecodeThread(linkedBlockingDeque, wakeUpNative, handler);
TMBOY 45:2aa9f933c8d2 117 wakeUpDecodeThread.setWakeUpListener(new WakeUpDecodeThread.IWakeUpListener() {
TMBOY 45:2aa9f933c8d2 118 @Override
TMBOY 45:2aa9f933c8d2 119 public void onWakeUpSucceed() {
TMBOY 45:2aa9f933c8d2 120 // 唤醒成功
TMBOY 45:2aa9f933c8d2 121 fireOnWakeUpSucceed();
TMBOY 45:2aa9f933c8d2 122 }
TMBOY 45:2aa9f933c8d2 123 });
TMBOY 45:2aa9f933c8d2 124 wakeUpDecodeThread.startWakeUp();
TMBOY 45:2aa9f933c8d2 125 }
TMBOY 45:2aa9f933c8d2 126
TMBOY 45:2aa9f933c8d2 127 private void fireOnWakeUpSucceed() {
TMBOY 45:2aa9f933c8d2 128 for (IWakeUpListener listener : wakeUpListeners) {
TMBOY 45:2aa9f933c8d2 129 listener.onWakeUpSucceed();
TMBOY 45:2aa9f933c8d2 130 }
TMBOY 45:2aa9f933c8d2 131 }
TMBOY 45:2aa9f933c8d2 132 }