From de3f9462e020ad2f4c7302ec07fa808d177cec95 Mon Sep 17 00:00:00 2001
From: 夜雨飘零 <yeyupiaoling@foxmail.com>
Date: 星期三, 18 十月 2023 16:20:35 +0800
Subject: [PATCH] change send data size (#1014)

---
 funasr/runtime/android/AndroidClient/app/src/main/java/com/yeyupiaoling/androidclient/MainActivity.java |  165 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 126 insertions(+), 39 deletions(-)

diff --git a/funasr/runtime/android/AndroidClient/app/src/main/java/com/yeyupiaoling/androidclient/MainActivity.java b/funasr/runtime/android/AndroidClient/app/src/main/java/com/yeyupiaoling/androidclient/MainActivity.java
index 1ea426a..be14bd3 100644
--- a/funasr/runtime/android/AndroidClient/app/src/main/java/com/yeyupiaoling/androidclient/MainActivity.java
+++ b/funasr/runtime/android/AndroidClient/app/src/main/java/com/yeyupiaoling/androidclient/MainActivity.java
@@ -2,26 +2,31 @@
 
 import android.Manifest;
 import android.annotation.SuppressLint;
+import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
 import android.media.AudioFormat;
 import android.media.AudioRecord;
 import android.media.MediaRecorder;
 import android.os.Bundle;
 import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
 import android.widget.Button;
+import android.widget.EditText;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.core.app.ActivityCompat;
 
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
-
-import javax.net.ssl.HostnameVerifier;
 
 import okhttp3.OkHttpClient;
 import okhttp3.Request;
@@ -32,8 +37,15 @@
 
 public class MainActivity extends AppCompatActivity {
     public static final String TAG = MainActivity.class.getSimpleName();
-    // WebSocket鍦板潃锛屽鏋滄湇鍔$娌℃湁浣跨敤SSL锛岃浣跨敤ws://
-    public static final String ASR_HOST = "wss://192.168.0.1:10095";
+    // WebSocket鍦板潃
+    public String ASR_HOST = "";
+    // 鍙戦�佺殑JSON鏁版嵁
+    public static final String MODE = "2pass";
+    public static final String CHUNK_SIZE = "5, 10, 5";
+    public static final int CHUNK_INTERVAL = 10;
+    public static final int SEND_SIZE = 1920;
+    // 鐑瘝
+    private String hotWords = "闃块噷宸村反 杈炬懇闄� 澶滈洦椋橀浂";
     // 閲囨牱鐜�
     public static final int SAMPLE_RATE = 16000;
     // 澹伴亾鏁�
@@ -42,10 +54,10 @@
     public static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
     private AudioRecord audioRecord;
     private boolean isRecording = false;
-    private int minBufferSize;
     private AudioView audioView;
     private String allAsrText = "";
     private String asrText = "";
+    private SharedPreferences sharedPreferences;
     // 鎺т欢
     private Button recordBtn;
     private TextView resultText;
@@ -60,8 +72,6 @@
         if (!hasPermission()) {
             requestPermission();
         }
-        // 褰曢煶鍙傛暟
-        minBufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL, AUDIO_FORMAT);
         // 鏄剧ず璇嗗埆缁撴灉鎺т欢
         resultText = findViewById(R.id.result_text);
         // 鏄剧ず褰曢煶鐘舵�佹帶浠�
@@ -71,22 +81,100 @@
         recordBtn = findViewById(R.id.record_button);
         recordBtn.setOnTouchListener((v, event) -> {
             if (event.getAction() == MotionEvent.ACTION_UP) {
-                isRecording = false;
-                stopRecording();
-                recordBtn.setText("鎸変笅褰曢煶");
-            } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
-                if (webSocket != null){
-                    webSocket.cancel();
-                    webSocket = null;
+                if (!ASR_HOST.equals("")) {
+                    isRecording = false;
+                    stopRecording();
+                    recordBtn.setText("鎸変笅褰曢煶");
                 }
-                allAsrText = "";
-                asrText = "";
-                isRecording = true;
-                startRecording();
-                recordBtn.setText("褰曢煶涓�...");
+            } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
+                if (!ASR_HOST.equals("")) {
+                    allAsrText = "";
+                    asrText = "";
+                    isRecording = true;
+                    startRecording();
+                    recordBtn.setText("褰曢煶涓�...");
+                }
             }
             return true;
         });
+        // 璇诲彇WebSocket鍦板潃
+        sharedPreferences = getSharedPreferences("FunASR", MODE_PRIVATE);
+        String uri = sharedPreferences.getString("uri", "");
+        if (uri.equals("")) {
+            showUriInput();
+        } else {
+            ASR_HOST = uri;
+        }
+        // 璇诲彇鐑瘝
+        String hotWords = sharedPreferences.getString("hotwords", "");
+        if (!hotWords.equals("")) {
+            this.hotWords = hotWords;
+        }
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.menu, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+        int id = item.getItemId();
+        if (id == R.id.change_uri) {
+            showUriInput();
+            return true;
+        } else if (id == R.id.change_hotwords) {
+            showHotWordsInput();
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    // 鏄剧ずWebSocket鍦板潃杈撳叆妗�
+    private void showUriInput() {
+        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
+        builder.setTitle("璇疯緭鍏ebSocket鍦板潃锛�");
+        View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_input_uri, null);
+        final EditText input = view.findViewById(R.id.uri_edit_text);
+        if (!ASR_HOST.equals("")) {
+            input.setText(ASR_HOST);
+        }
+        builder.setView(view);
+        builder.setPositiveButton("纭畾", (dialog, id) -> {
+            ASR_HOST = input.getText().toString();
+            if (!ASR_HOST.equals("")) {
+                Toast.makeText(MainActivity.this, "WebSocket鍦板潃锛�" + ASR_HOST, Toast.LENGTH_SHORT).show();
+                SharedPreferences.Editor editor = sharedPreferences.edit();
+                editor.putString("uri", ASR_HOST);
+                editor.apply();
+            }
+        });
+        AlertDialog dialog = builder.create();
+        dialog.show();
+    }
+
+    // 鏄剧ず鐑瘝杈撳叆妗�
+    private void showHotWordsInput() {
+        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
+        builder.setTitle("璇疯緭鍏ョ儹璇嶏細");
+        View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog_input_hotwords, null);
+        final EditText input = view.findViewById(R.id.hotwords_edit_text);
+        if (!this.hotWords.equals("")) {
+            input.setText(this.hotWords);
+        }
+        builder.setView(view);
+        builder.setPositiveButton("纭畾", (dialog, id) -> {
+            String hotwords = input.getText().toString();
+            if (!hotwords.equals("")) {
+                this.hotWords = hotwords;
+                SharedPreferences.Editor editor = sharedPreferences.edit();
+                editor.putString("hotwords", hotwords);
+                editor.apply();
+            }
+        });
+        AlertDialog dialog = builder.create();
+        dialog.show();
     }
 
     // 寮�濮嬪綍闊�
@@ -94,12 +182,12 @@
         // 鍑嗗褰曢煶鍣�
         try {
             // 纭繚鏈夋潈闄�
-            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
+            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
                 requestPermission();
                 return;
             }
             // 鍒涘缓褰曢煶鍣�
-            audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE, CHANNEL, AUDIO_FORMAT, minBufferSize);
+            audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE, CHANNEL, AUDIO_FORMAT, SEND_SIZE);
         } catch (IllegalStateException e) {
             e.printStackTrace();
         }
@@ -127,14 +215,12 @@
 
     // 璇诲彇褰曢煶鏁版嵁
     private void setAudioData() throws Exception {
-        // 濡傛灉浣跨敤姝e父鐨剋ss锛屽彲浠ュ幓鎺夎繖涓�
-        HostnameVerifier hostnameVerifier = (hostname, session) -> {
-            // 鎬绘槸杩斿洖true锛岃〃绀轰笉楠岃瘉鍩熷悕
-            return true;
-        };
         // 寤虹珛WebSocket杩炴帴
         OkHttpClient client = new OkHttpClient.Builder()
-                .hostnameVerifier(hostnameVerifier)
+                // 蹇界暐楠岃瘉璇佷功
+                .sslSocketFactory(SSLSocketClient.getSSLSocketFactory(), SSLSocketClient.getX509TrustManager())
+                // 涓嶉獙璇佸煙鍚�
+                .hostnameVerifier(SSLSocketClient.getHostnameVerifier())
                 .build();
         Request request = new Request.Builder()
                 .url(ASR_HOST)
@@ -145,6 +231,7 @@
             public void onOpen(@NonNull WebSocket webSocket, @NonNull Response response) {
                 // 杩炴帴鎴愬姛鏃剁殑澶勭悊
                 Log.d(TAG, "WebSocket杩炴帴鎴愬姛");
+                runOnUiThread(() -> Toast.makeText(MainActivity.this, "WebSocket杩炴帴鎴愬姛", Toast.LENGTH_SHORT).show());
             }
 
             @Override
@@ -189,15 +276,16 @@
             public void onFailure(@NonNull WebSocket webSocket, @NonNull Throwable t, Response response) {
                 // 杩炴帴澶辫触鏃剁殑澶勭悊
                 Log.d(TAG, "WebSocket杩炴帴澶辫触: " + t + ": " + response);
+                runOnUiThread(() -> Toast.makeText(MainActivity.this, "WebSocket杩炴帴澶辫触锛�" + t, Toast.LENGTH_SHORT).show());
             }
         });
-        String message = getMessage("2pass", "5, 10, 5", 10, true);
+        String message = getMessage(true);
         webSocket.send(message);
 
         audioRecord.startRecording();
-        byte[] bytes = new byte[minBufferSize];
+        byte[] bytes = new byte[SEND_SIZE];
         while (isRecording) {
-            int readSize = audioRecord.read(bytes, 0, minBufferSize);
+            int readSize = audioRecord.read(bytes, 0, SEND_SIZE);
             if (readSize > 0) {
                 ByteString byteString = ByteString.of(bytes);
                 webSocket.send(byteString);
@@ -211,20 +299,19 @@
     }
 
     // 鍙戦�佺涓�姝ョ殑JSON鏁版嵁
-    public String getMessage(String mode, String strChunkSize, int chunkInterval, boolean isSpeaking) {
+    public String getMessage(boolean isSpeaking) {
         try {
             JSONObject obj = new JSONObject();
-            obj.put("mode", mode);
+            obj.put("mode", MODE);
             JSONArray array = new JSONArray();
-            String[] chunkList = strChunkSize.split(",");
+            String[] chunkList = CHUNK_SIZE.split(",");
             for (String s : chunkList) {
                 array.put(Integer.valueOf(s.trim()));
             }
             obj.put("chunk_size", array);
-            obj.put("chunk_interval", chunkInterval);
+            obj.put("chunk_interval", CHUNK_INTERVAL);
             obj.put("wav_name", "default");
-            // 鐑瘝
-            obj.put("hotwords", "闃块噷宸村反 杈炬懇闄�");
+            obj.put("hotwords", hotWords);
             obj.put("wav_format", "pcm");
             obj.put("is_speaking", isSpeaking);
             return obj.toString();
@@ -236,13 +323,13 @@
 
     // 妫�鏌ユ潈闄�
     private boolean hasPermission() {
-        return checkSelfPermission(android.Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED &&
-                checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
+        return checkSelfPermission(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED &&
+                checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
     }
 
     // 璇锋眰鏉冮檺
     private void requestPermission() {
-        requestPermissions(new String[]{android.Manifest.permission.RECORD_AUDIO,
+        requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO,
                 Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
     }
 }
\ No newline at end of file

--
Gitblit v1.9.1