基于Dragonboard410c的智能音箱(五)
2017-09-14 15:36
447 查看
前面我们已经简单的实现了一个音乐播放器,接下来就应该把讯飞的语音识别模块给合进去,实现我们的智能语音控制功能。
我们可以设计成这样,在语音控制之前,我们按一下前面实现的按键功能,作为开始输入语音的信号,然后只要识别出我们的几个关键字“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,大功告成,简单的智能音箱就实现啦!
相关文章推荐
- 基于Dragonboard410c的智能音箱(一)
- 基于Dragonboard410c的智能音箱(四)
- 基于Dragonboard410c的智能音箱(二)
- 基于Dragonboard410c的智能音箱(三)
- 基于Dragon Board410c 的智能机器人预研-语音识别及定位
- 基于dragonboard410c 智能门锁 开发
- 基于DragonBoard410C的智能管家
- 基于Dragon Board410c 的智能机器人预研-语音识别及定位
- 基于DragonBoard410c的智能照明系统
- 基于DragonBoard 410c的家庭智能环保卫士——(6)kobuki位置信息传输及显示
- 基于DragonBoard 410c的家庭智能环保卫士——(9)数据库设计
- 基于Dragonboard410c的Turtlebot开机自启动功能
- 基于dragonboard 410c的智能魔镜设计(2)——数据库设计与实现
- 基于DragonBoard 410c的智能门铃系列三之系统功能分析
- 基于Dragonboard 410c的智能小车(一)
- 基于Dragonboard 410c的家庭智能环保卫士——(2)方案设计
- 基于DragonBord410C的智能遥控
- 基于dragonboard 410c的智能魔镜设计(5)——基于人脸的用户身份识别
- 基于DragonBoard 410c的家庭智能环保卫士——(12)环境数据融合
- 基于dragonboard 410c的智能魔镜设计(6)——人脸检测及身份识别启动模块封装