基於Dragonboard410c的智能音箱(五)

前面我們已經簡單的實現了一個音樂播放器,接下來就應該把訊飛的語音識別模塊給合進去,實現我們的智能語音控制功能。

我們可以設計成這樣,在語音控制之前,我們按一下前面實現的按鍵功能,作爲開始輸入語音的信號,然後只要識別出我們的幾個關鍵字“play/stop/next/last”,就按照不同的關鍵字進行相應的操作,如果識別到其他語音信息,就不做任何處理。

下面是我的實現代碼:

public class MainActivity extends Activity implements View.OnClickListener {

    private Button puase, stop, last, next;
    private RadioButton start;
    private ListView listView;
    private TextView totle, current_time;
    private SeekBar progressBar;
    private SpeechRecognizer mIat;
    private Data data;
    private String mEngineType = SpeechConstant.TYPE_CLOUD;
    public final static int PLAY = 1;
    public final static int STOP = 2;
    public final static int NEXT = 3;
    public final static int LAST = 4;
    private ArrayList<String> save;
    private PlayMusicBackgoundService service;
    private ServiceConnection connection;
    private boolean isstart = true;
    private Timer timer;
    private int onplay = 0;
    private String currentmusic = null;
    private boolean firstin = false;

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    Lastsong();
                    break;
                case 2:
                    Nextsong();
                    break;
                case 3:
                    StartOrResume();
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initvariable();
        request();
        timer = new Timer();
        mIat = SpeechRecognizer.createRecognizer(this, mlisterner);
    }

    private void request() {
        requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, 1);
    }

    private String TAG = "SmartSpeakers";
    private InitListener mlisterner = new InitListener() {
        @Override
        public void onInit(int i) {
            if (i != ErrorCode.SUCCESS) {
                Log.i(TAG, "init fail!!!!");
            }
        }
    };


    private void initvariable() {
        start = findViewById(R.id.start);
        start.setFocusable(false);
        last = findViewById(R.id.last);
        last.setFocusable(false);
        next = findViewById(R.id.next);
        next.setFocusable(false);
        listView = findViewById(R.id.music);
        listView.setFocusable(false);
        totle = findViewById(R.id.count_time);
        totle.setFocusable(false);
        current_time = findViewById(R.id.current_time);
        current_time.setFocusable(false);
        progressBar = findViewById(R.id.advance);
        progressBar.setFocusable(false);
        start.setOnClickListener(this);
        last.setOnClickListener(this);
        next.setOnClickListener(this);

        save = new ArrayList<>();
        Intent intent = new Intent();
        intent.setAction("android.intent.action.BUND");
        intent.setPackage("com.thundersoft.boardapk");
        intent.putExtra("all", save);
        connection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                service = (PlayMusicBackgoundService) ((PlayMusicBackgoundService.MyServices) iBinder).getServices();
            }

            @Override
            public void onServiceDisconnected(ComponentName componentName) {

            }
        };
        bindService(intent, connection, BIND_AUTO_CREATE);
        if (firstin) {
            scanFile();
        }
    }

    private void scanFile() {
        String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Song";
        File file = new File(path);
        save.clear();
        for (File file1 : file.listFiles()) {
            if (file1.getName().endsWith(".mp3")) {
                save.add(file1.getName());
            }
        }
        ListAdapter adapter = new ListAdapter(save, this);
        listView.setAdapter(adapter);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.start:
                StartOrResume();
                break;
            case R.id.last:
                Lastsong();
                break;
            case R.id.next:
                Nextsong();
                break;
        }

    }

    private void StartOrResume() {
        if (isstart) {
            start.setText("Pause");
            isstart = false;
        } else {
            start.setText("Start");
            isstart = false;
        }
        //以第一首歌爲基礎開始變化
        currentmusic = save.get(0);
        action(PLAY, currentmusic);
    }

    private void Lastsong() {
        if (onplay == 0) {
            action(LAST, save.get(save.size() - 1));
            currentmusic = save.get(save.size() - 1);
            onplay = save.size() - 1;
        } else {
            Log.i("LAST", onplay + "");
            action(LAST, save.get(onplay - 1));
            currentmusic = save.get(onplay - 1);
            onplay = onplay - 1;
        }
        start.setText("Pause");
        isstart = false;
    }

    private void Nextsong() {
        if (onplay == (save.size() - 1)) {
            action(NEXT, save.get(0));
            currentmusic = save.get(0);
            onplay = 0;
            Log.i("onlpay", "" + onplay);
        } else {
            action(NEXT, save.get(onplay + 1));
            currentmusic = save.get(onplay + 1);
            onplay = onplay + 1;
        }
        start.setText("Pause");
        isstart = false;
    }

    public void action(int action, String path) {
        Intent intent = new Intent(this, PlayMusicBackgoundService.class);
        intent.putExtra("action", action);
        intent.putExtra("path", path);
        startService(intent);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == 1) {
            scanFile();
            firstin = true;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(connection);
    }

    public void setParam() {
        mIat.setParameter(SpeechConstant.PARAMS, null);
        mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
        mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
        mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");
        mIat.setParameter(SpeechConstant.ACCENT, null);
        mIat.setParameter(SpeechConstant.VAD_BOS, "3000");
        mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
    }


    private RecognizerListener recognizerListener = new RecognizerListener() {
        @Override
        public void onVolumeChanged(int i, byte[] bytes) {

        }

        @Override
        public void onBeginOfSpeech() {
            Log.i(TAG, "Start Recorder");
        }

        @Override
        public void onEndOfSpeech() {
            Log.i(TAG, "End Recorder");
        }

        @Override
        public void onResult(RecognizerResult recognizerResult, boolean b) {
            String result = "";
            if (b) {
                result += recognizerResult.getResultString() + ",";
            } else {
                result += recognizerResult.getResultString() + "";
            }
            //Log.i(TAG, result);
           /* Gson gson = new Gson();
            JsonReader reader = new JsonReader(new StringReader(result));
            Log.i(TAG,result);
            reader.setLenient(true);
            data = gson.fromJson(reader, Data.class);*/
            //Log.i(TAG,"value *****"+ data.getWs().get(0).getCw().get(0).getW() + "");
            if (result.contains("last") || result.contains("Last")) {
                Message message = new Message();
                message.what = 1;
                handler.sendMessage(message);
            } else if (result.contains("Next") || result.contains("next")) {
                Message message = new Message();
                message.what = 2;
                handler.sendMessage(message);
            } else if (result.contains("Play") || result.contains("play") || result.contains("stop") || result.contains("Stop")) {
                Message message = new Message();
                message.what = 3;
                handler.sendMessage(message);
            }


        }

        @Override
        public void onError(SpeechError speechError) {
            Log.i(TAG, "" + speechError.getErrorCode());
        }

        @Override
        public void onEvent(int i, int i1, int i2, Bundle bundle) {

        }
    };

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == event.KEYCODE_ENTER) {
            setParam();
            mIat.startListening(recognizerListener);
        }
        return false;
    }
}

OK,大功告成,簡單的智能音箱就實現啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章