From e877f0fd073145dfef4c476fee3366356bd934a2 Mon Sep 17 00:00:00 2001 From: Winter <1558270516@qq.com> Date: Sun, 11 Dec 2022 12:57:59 +0800 Subject: [PATCH] [Android] add VoiceAssistant app example (#834) * [Android]add VoiceAssistant. * Create VoiceAssistantDemo * Update and rename VoiceAssistantDemo to VoiceAssistantDemo.md * Update VoiceAssistantDemo.md * Delete VoiceAssistantDemo.md * [Android]1.delete about core folder. 2.build and configure bdasr_V3_20210628_cfe8c44.aar file. * change app/build.gradle etc. * Update build.gradle Co-authored-by: DefTruth <31974251+DefTruth@users.noreply.github.com> --- java/android/app/build.gradle | 10 +- .../VoiceAssistantMainActivity.java | 211 ++++++++++++++++++ .../VoiceAssistantWelcomeActivity.java | 30 +++ .../layout/voice_assistant_activity_main.xml | 89 ++++++++ .../res/layout/voice_assistant_welcome.xml | 76 +++++++ java/android/ui/src/main/AndroidManifest.xml | 2 + .../com/baidu/paddle/fastdeploy/ui/Utils.java | 26 +++ 7 files changed, 441 insertions(+), 3 deletions(-) create mode 100644 java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ernie/applications/VoiceAssistantMainActivity.java create mode 100644 java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ernie/applications/VoiceAssistantWelcomeActivity.java create mode 100644 java/android/app/src/main/res/layout/voice_assistant_activity_main.xml create mode 100644 java/android/app/src/main/res/layout/voice_assistant_welcome.xml diff --git a/java/android/app/build.gradle b/java/android/app/build.gradle index fde73b3b31..23b2041354 100644 --- a/java/android/app/build.gradle +++ b/java/android/app/build.gradle @@ -5,7 +5,7 @@ android { defaultConfig { applicationId 'com.baidu.paddle.fastdeploy.app.examples' - minSdkVersion 15 + minSdkVersion 16 //noinspection ExpiredTargetSdkVersion targetSdkVersion 28 versionCode 1 @@ -79,6 +79,10 @@ def FD_JAVA_SDK = [ [ 'src' : 'https://bj.bcebos.com/fastdeploy/test/fastdeploy-android-sdk-latest-dev.aar', 'dest': 'libs' + ], + [ + 'src' : 'https://bj.bcebos.com/fastdeploy/test/bdasr_V3_20210628_cfe8c44.aar', + 'dest': 'libs' ] ] @@ -132,7 +136,7 @@ task downloadAndExtractSDKs(type: DefaultTask) { boolean copyFiles = false if (!file("${sdk.dest}/${sdkName}").exists()) { // Download the target SDK if not exists - if (file("${cachePath}/${sdkName}").exists()) { + if (!file("${cachePath}/${sdkName}").exists()) { println "[INFO] Downloading ${sdk.src} -> ${cachePath}/${sdkName}" ant.get(src: sdk.src, dest: file("${cachePath}/${sdkName}")) } @@ -152,4 +156,4 @@ task downloadAndExtractSDKs(type: DefaultTask) { } preBuild.dependsOn downloadAndExtractSDKs -preBuild.dependsOn downloadAndExtractModels \ No newline at end of file +preBuild.dependsOn downloadAndExtractModels diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ernie/applications/VoiceAssistantMainActivity.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ernie/applications/VoiceAssistantMainActivity.java new file mode 100644 index 0000000000..cd15925028 --- /dev/null +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ernie/applications/VoiceAssistantMainActivity.java @@ -0,0 +1,211 @@ +package com.baidu.paddle.fastdeploy.app.examples.ernie.applications; + +import static com.baidu.paddle.fastdeploy.ui.Utils.isNetworkAvailable; + +import android.Manifest; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import com.baidu.aip.asrwakeup3.core.mini.AutoCheck; +import com.baidu.aip.asrwakeup3.core.util.AuthUtil; +import com.baidu.paddle.fastdeploy.app.examples.R; +import com.baidu.speech.EventListener; +import com.baidu.speech.EventManager; +import com.baidu.speech.EventManagerFactory; +import com.baidu.speech.asr.SpeechConstant; + +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class VoiceAssistantMainActivity extends Activity implements View.OnClickListener, EventListener { + private Button startVoiceBtn; + private TextView voiceOutput; + private Button startIntentBtn; + private TextView intentOutput; + private ImageView back; + private EventManager asr; + private Boolean isStartVoice = false; + private String voiceTxt = ""; + private int times = 0; + private final int REQUEST_PERMISSION = 0; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // Fullscreen + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + + setContentView(R.layout.voice_assistant_activity_main); + + init(); + } + + private void init() { + checkPermission(); + asr = EventManagerFactory.create(this, "asr"); + asr.registerListener(this); + startVoiceBtn = findViewById(R.id.btn_voice); + startVoiceBtn.setOnClickListener(this); + voiceOutput = findViewById(R.id.tv_voice_output); + back = findViewById(R.id.iv_back); + back.setOnClickListener(this); + startIntentBtn = findViewById(R.id.btn_intent); + startIntentBtn.setOnClickListener(this); + intentOutput = findViewById(R.id.tv_intent_output); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.btn_voice: + if (!isNetworkAvailable(this)) { + new AlertDialog.Builder(VoiceAssistantMainActivity.this) + .setMessage("请先连接互联网。") + .setCancelable(true) + .show(); + return; + } + if (!isStartVoice) { + isStartVoice = true; + startVoiceBtn.setText("停止录音"); + start(); + } else { + isStartVoice = false; + startVoiceBtn.setText("开始录音"); + stop(); + } + break; + case R.id.iv_back: + finish(); + break; + case R.id.btn_intent: + if (voiceTxt.equals("")) { + new AlertDialog.Builder(VoiceAssistantMainActivity.this) + .setMessage("请先录音。") + .setCancelable(true) + .show(); + return; + } + intentOutput.setText("我刚才说了:" + voiceTxt); + break; + } + } + + @Override + public void onEvent(String name, String params, byte[] data, int offset, int length) { + if (name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)) { + if (params.contains("\"final_result\"")) { + if (params.contains("[")) { + voiceTxt = params.substring(params.lastIndexOf('[') + 1, params.lastIndexOf(']')); + } + voiceOutput.setText(voiceTxt); + } + } + } + + private void start() { + Map params = AuthUtil.getParam(); + String event = null; + event = SpeechConstant.ASR_START; + params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, false); + (new AutoCheck(getApplicationContext(), new Handler() { + public void handleMessage(Message msg) { + if (msg.what == 100) { + AutoCheck autoCheck = (AutoCheck) msg.obj; + synchronized (autoCheck) { + String message = autoCheck.obtainErrorMessage(); + Log.e(getClass().getName(), message); + } + } + } + }, false)).checkAsr(params); + String json = null; + json = new JSONObject(params).toString(); + asr.send(event, json, null, 0, 0); + } + + private void stop() { + asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0); + } + + @Override + protected void onPause() { + super.onPause(); + asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + asr.send(SpeechConstant.ASR_CANCEL, "{}", null, 0, 0); + asr.unregisterListener(this); + } + + private void checkPermission() { + times++; + final List permissionsList = new ArrayList<>(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if ((checkSelfPermission(Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED)) + permissionsList.add(Manifest.permission.RECORD_AUDIO); + if ((checkSelfPermission(Manifest.permission.ACCESS_NETWORK_STATE) != PackageManager.PERMISSION_GRANTED)) + permissionsList.add(Manifest.permission.ACCESS_NETWORK_STATE); + if ((checkSelfPermission(Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED)) { + permissionsList.add(Manifest.permission.INTERNET); + } + if ((checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { + permissionsList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + if (permissionsList.size() != 0) { + if (times == 1) { + requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), + REQUEST_PERMISSION); + } else { + new AlertDialog.Builder(this) + .setCancelable(true) + .setTitle("提示") + .setMessage("获取不到授权,APP将无法正常使用,请允许APP获取权限!") + .setPositiveButton("确定", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface arg0, int arg1) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), + REQUEST_PERMISSION); + } + } + }).setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface arg0, int arg1) { + finish(); + } + }).show(); + } + } + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + checkPermission(); + } +} diff --git a/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ernie/applications/VoiceAssistantWelcomeActivity.java b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ernie/applications/VoiceAssistantWelcomeActivity.java new file mode 100644 index 0000000000..f81c1c0caa --- /dev/null +++ b/java/android/app/src/main/java/com/baidu/paddle/fastdeploy/app/examples/ernie/applications/VoiceAssistantWelcomeActivity.java @@ -0,0 +1,30 @@ +package com.baidu.paddle.fastdeploy.app.examples.ernie.applications; + +import android.app.Activity; +import android.content.Intent; +import android.graphics.Color; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; + +import com.baidu.paddle.fastdeploy.app.examples.R; + +public class VoiceAssistantWelcomeActivity extends Activity { + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + ); + getWindow().setStatusBarColor(Color.TRANSPARENT); + } + setContentView(R.layout.voice_assistant_welcome); + } + + public void startActivity(View view) { + Intent intent = new Intent(VoiceAssistantWelcomeActivity.this, VoiceAssistantMainActivity.class); + startActivity(intent); + } +} diff --git a/java/android/app/src/main/res/layout/voice_assistant_activity_main.xml b/java/android/app/src/main/res/layout/voice_assistant_activity_main.xml new file mode 100644 index 0000000000..c6376ac381 --- /dev/null +++ b/java/android/app/src/main/res/layout/voice_assistant_activity_main.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + +