From: xiewei <892331662@qq.com> Date: Mon, 17 Feb 2025 08:54:54 +0000 (+0800) Subject: 250217:第一版 X-Git-Url: http://git.snicker.com.cn/sitemap.xml?a=commitdiff_plain;h=0640e55c79285c4e5bfb728ae81519f4444d8fde;p=mirrors%2Fpoly-sdk.git 250217:第一版 --- diff --git a/app/build.gradle b/app/build.gradle index 116c041..4ba284a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,7 +38,7 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' implementation project(path: ':polysdk') -// implementation(fileTree("libs/Poly-SDK-1.3-202407061157.aar")) +// implementation(fileTree("libs/Poly-SDK-1.6-202409021027.aar")) implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'com.google.code.gson:gson:2.10' implementation 'com.github.bumptech.glide:glide:4.0.0-RC1' diff --git a/app/libs/Poly-SDK-1.6-202409021027.aar b/app/libs/Poly-SDK-1.6-202409021027.aar new file mode 100644 index 0000000..e495089 Binary files /dev/null and b/app/libs/Poly-SDK-1.6-202409021027.aar differ diff --git a/app/libs/Poly-SDK-1.6-202410251023.aar b/app/libs/Poly-SDK-1.6-202410251023.aar new file mode 100644 index 0000000..f242144 Binary files /dev/null and b/app/libs/Poly-SDK-1.6-202410251023.aar differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8cca1e2..9e59667 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,12 +3,13 @@ xmlns:tools="http://schemas.android.com/tools"> - + + + tools:targetApi="31"> + diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AsrActivity.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AsrActivity.java index 1b1406a..f9f306c 100644 --- a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AsrActivity.java +++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AsrActivity.java @@ -130,6 +130,16 @@ public class AsrActivity extends AppCompatActivity { mediaPlayer.playData(msg); } + @Override + public void onSynthesisEnd() { + + } + + @Override + public void onFail(String msg) { + + } + @Override public void onLongTextStreamChange(byte[] msg) { mediaPlayer.playData(msg); @@ -143,7 +153,7 @@ public class AsrActivity extends AppCompatActivity { public void onSuccess(Object result) { String text = (String) result; speedSb2.append(text); - PolymerizeAgent.getInstance().getAiAPI().sendLongTextStream(text); + PolymerizeAgent.getInstance().getAiAPI().sendLongTextStream(text,"mp3",8000); Log.i(TAG,"translate--"+text); runOnUiThread(new Runnable() { @Override @@ -155,7 +165,6 @@ public class AsrActivity extends AppCompatActivity { } msgAdapter2.notifyItemChanged(msgPosition2); - } }); } diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AudioPlayer.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AudioPlayer.java index 927411d..5d52b13 100644 --- a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AudioPlayer.java +++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/AudioPlayer.java @@ -3,12 +3,16 @@ package com.zhixun.android.sdk.polymerizesdk; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioTrack; +import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.util.Log; import androidx.annotation.NonNull; +import com.zhixun.android.sdk.polysdk.authentication.AuthMsgSendHandler; + import java.util.ArrayList; import java.util.List; @@ -18,17 +22,38 @@ public class AudioPlayer { private final int MSG_PLAY = 101; private String TAG = "AudioPlayer"; private List playList = new ArrayList<>(); - private Handler audioHandler = new Handler(){ - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - switch (msg.what){ - case MSG_PLAY: - - break; - } + private Handler audioHandler; + private AudioLooperThread audioLooperThread; + class AudioLooperThread extends Thread { + public void run() { + Looper.prepare(); + audioHandler = new Handler(){ + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + switch (msg.what){ + case MSG_PLAY: + Log.i(TAG,"play---111---"); + byte[] data = (byte[]) msg.obj; + if (audioTrack != null) { + audioTrack.play(); + int length = data.length; + while (length > 0&&audioTrack != null) { + int written = audioTrack.write(data, 0, length); + length -= written; + } + Log.i(TAG,"play---end---"); + } + + break; + } + } + }; + Looper.loop(); + } - }; + } + public AudioPlayer(int sampleRate, int channelConfig, int audioFormat) { // 初始化buffer size @@ -39,24 +64,27 @@ public class AudioPlayer { } public AudioPlayer() { + audioLooperThread = new AudioLooperThread(); + audioLooperThread.start(); int sampleRate = 16000; int channelConfig = AudioFormat.CHANNEL_OUT_STEREO; - int audioFormat = AudioFormat.ENCODING_PCM_16BIT; + int audioFormat = AudioFormat.ENCODING_PCM_8BIT; // 初始化buffer size bufferSize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat); // 初始化AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, - sampleRate, channelConfig, audioFormat, bufferSize, AudioTrack.MODE_STREAM); + sampleRate, + AudioFormat.CHANNEL_OUT_MONO, + AudioFormat.ENCODING_PCM_16BIT, + bufferSize, + AudioTrack.MODE_STREAM); audioTrack.setPositionNotificationPeriod(bufferSize); audioTrack.setPlaybackPositionUpdateListener(new AudioTrack.OnPlaybackPositionUpdateListener() { @Override public void onMarkerReached(AudioTrack track) { //播放完成 Log.i(TAG,"onMarkerReached"); - if(playList.size()>0){ - play(playList.get(0)); - playList.remove(0); - } + } @Override @@ -66,53 +94,25 @@ public class AudioPlayer { }); } + private byte[] cacheAudio = new byte[0]; + public synchronized void play(byte[] audioData) { + Log.i(TAG,"play---"+cacheAudio.length); +// if(cacheAudio.length<40*1024){ +// cacheAudio = ByteTools.concatAll(cacheAudio,audioData); +// }else { + Message message = new Message(); + message.what = MSG_PLAY; + message.obj = audioData; + audioHandler.sendMessage(message); + cacheAudio = new byte[0]; +// } - public void play(byte[] audioData) { - if (audioTrack != null) { - - int state = audioTrack.getPlaybackHeadPosition(); - Log.e(TAG,"paly state="+state); - if (state > 0) { - // AudioTrack正在播放或暂停 - playList.add(audioData); - }else { - new Thread(new Runnable() { - @Override - public void run() { - // 写入数据并播放 - audioTrack.write(audioData, 0, audioData.length); - // 播放音频 - audioTrack.play(); - double audioDurationInSeconds = (double) audioData.length / (audioTrack.getSampleRate() * 2); - long len = (long) audioDurationInSeconds; - if(len<1){ - len = 1; - } - try { - Thread.sleep(len); - Log.e(TAG,"playState---"+len); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - audioTrack.stop(); - if(playList.size()>0){ - play(playList.get(0)); - playList.remove(0); - } - - - } - }).start(); - - } - - } } + public void stop() { if (audioTrack != null) { - // 停止并释放资源 audioTrack.stop(); audioTrack.release(); audioTrack = null; diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/ChatActivity.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/ChatActivity.java index d9380b6..4dbe0b4 100644 --- a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/ChatActivity.java +++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/ChatActivity.java @@ -19,6 +19,7 @@ import com.zhixun.android.sdk.polysdk.PolymerizeAgent; import com.zhixun.android.sdk.polysdk.callback.IAIChannelChangeCallback; import com.zhixun.android.sdk.polysdk.callback.IAudioConvertListener; import com.zhixun.android.sdk.polysdk.callback.OnChatMsgListener; +import com.zhixun.android.sdk.polysdk.callback.OnTTSDataChange; import com.zhixun.android.sdk.polysdk.callback.OnTranscriptionDataChange; import java.io.File; @@ -40,8 +41,9 @@ public class ChatActivity extends AppCompatActivity { private boolean isStartTranscrip = false; private StringBuffer speedSb = new StringBuffer(); private StringBuffer chatBuff = new StringBuffer(); + private AudioPlayer audioPlayer; - + private StringBuffer ttsStr = new StringBuffer(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -53,9 +55,10 @@ public class ChatActivity extends AppCompatActivity { msg_listview.setAdapter(msgAdapter); LinearLayoutManager layoutManager = new LinearLayoutManager(this); msg_listview.setLayoutManager(layoutManager); - + audioPlayer = new AudioPlayer(); PolymerizeAgent.getInstance().getAiAPI().startTrans(); + PolymerizeAgent.getInstance().getAiAPI().setOnChatMsgListener(new OnChatMsgListener() { @Override public void onChange(String type, String text) { @@ -75,8 +78,20 @@ public class ChatActivity extends AppCompatActivity { }else if(chatType.equals("end")){ chatPosition = -1; chatBuff = new StringBuffer(); + if(ttsStr.length()>0){ + PolymerizeAgent.getInstance().getAiAPI().sendLongTextStream(ttsStr.toString(),"pcm",16000); + ttsStr = new StringBuffer(); + } }else { if(!TextUtils.isEmpty(text)){ + Log.i(TAG,"ttsStr--"+ttsStr.length()); +// ttsStr.append(text); +// if(text.contains(",")&&ttsStr.length()>0){ +// PolymerizeAgent.getInstance().getAiAPI().sendLongTextStream(ttsStr.toString()); +// ttsStr = new StringBuffer(); +// } + PolymerizeAgent.getInstance().getAiAPI().runSynthesis(text); + msg_listview.post(new Runnable() { @Override public void run() { @@ -146,7 +161,6 @@ public class ChatActivity extends AppCompatActivity { @Override public void run() { ed_content.setText(speedSb.toString()); - } }); } @@ -154,6 +168,30 @@ public class ChatActivity extends AppCompatActivity { } }); + PolymerizeAgent.getInstance().getAiAPI().setOnTTSDataChange(new OnTTSDataChange() { + @Override + public void onSynthesisChange(byte[] msg) { + Log.e(TAG,"onSynthesisChange--"+msg.length); + audioPlayer.play(msg); + } + + @Override + public void onSynthesisEnd() { + Log.e(TAG,"onSynthesisEnd--"); + } + + @Override + public void onFail(String msg) { + Log.e(TAG,"onFail--"); + } + + @Override + public void onLongTextStreamChange(byte[] msg) { + Log.e(TAG,"onLongTextStreamChange--"+msg.length); + audioPlayer.play(msg); + } + }); + PolymerizeAgent.getInstance().getAiAPI().startSynthesis("pcm",16000); } public void back(View view){ @@ -183,12 +221,13 @@ public class ChatActivity extends AppCompatActivity { //moonshot (kimi 模型:moonshot-v1-8k) //aliyun (通义千问 模型:qwen-plus) //huoshan (豆包 模型:ep-20240611101421-5qk8s) - PolymerizeAgent.getInstance().getAuthenAPI().setAIChannelKey("CHAT GPT", API_KEY, new IAIChannelChangeCallback() { + /*PolymerizeAgent.getInstance().getAuthenAPI().setAIChannelKey("CHAT GPT", API_KEY, new IAIChannelChangeCallback() { @Override public void onChange(boolean result, String channel) { Log.d(TAG,"result--"+result+"--channel--"+channel); } - }); + });*/ + PolymerizeAgent.getInstance().getAiAPI().stopSynthesis(); } public void setBaidu(View view){ @@ -264,6 +303,8 @@ public class ChatActivity extends AppCompatActivity { protected void onDestroy() { super.onDestroy(); PolymerizeAgent.getInstance().getAiAPI().stopTrans(); + PolymerizeAgent.getInstance().getAiAPI().stopSynthesis(); + audioPlayer.stop(); } public void smbcTopcm(View view){ @@ -314,4 +355,6 @@ public class ChatActivity extends AppCompatActivity { return null; } } + + } \ No newline at end of file diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MainActivity.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MainActivity.java index b3bb7a4..8ba5809 100644 --- a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MainActivity.java +++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MainActivity.java @@ -62,8 +62,6 @@ public class MainActivity extends AppCompatActivity { startActivity(new Intent(this, ChatActivity.class)); - - } public void goTranslate(View view){ if(!isLogin){ @@ -88,6 +86,14 @@ public class MainActivity extends AppCompatActivity { startActivity(new Intent(this, AsrActivity.class)); } + public void goVoiceChat(View view){ + if(!isLogin){ + Toast.makeText(this,"请先鉴权",Toast.LENGTH_SHORT).show(); + return; + } + startActivity(new Intent(this, VoiceChatActivity.class)); + } + public void onespeed(View view){ if(!isLogin){ Toast.makeText(this,"请先鉴权",Toast.LENGTH_SHORT).show(); @@ -116,8 +122,8 @@ public class MainActivity extends AppCompatActivity { startActivity(new Intent(this, PicTestActivity.class)); } public void goRegiest(View view){ - PolymerizeAgent.getInstance().getAuthenAPI().regiest("HHosiYUNdG42t1cTgKOzIUPOvAVMI2QT" - , "FD2420000083", "pafOCKLiUbeVHbdZlddH", new AuthCallback() { + PolymerizeAgent.getInstance().getAuthenAPI().regiest("YqggeKCxfEOVQGjUYrpQQdEstGpvojzn" + , "28110687C457", "WTxAKo2qD2pXOZZLW3zz", new AuthCallback() { @Override public void onSuccess(String result) { Log.i(TAG,"result--"+result); @@ -152,12 +158,19 @@ public class MainActivity extends AppCompatActivity { productKey = ccvUoJOLbXn secretKey = nNRjkRpKTxvprGaW deviceSecret = ZqqFHYeXf4xuv5jEfuHUE2hdMnoaegGi*/ - - private String pwd = "CVOachlw1DO1Ei5uabOkHd1wRYoMQA"; + //28110687C456 +// FD230 +// pid:Y1DxRdBfnzVZQrXHdrNl +// key:4EepovakpbqhZUnUDwH42KAADYGv4UUe +// +// FD242 +// pid:pafOCKLiUbeVHbdZlddH +// key:HHosiYUNdG42t1cTgKOzIUPOvAVMI2QT + private String pwd = "HFXNgAAWqUVsBPJEyMyoTxnoJV5aQT"; public void goLogin(View view){ pwd = SpUtils.getInstance().getStringValue("devicePwd"); - PolymerizeAgent.getInstance().getAuthenAPI().authentication("FD2420000083" - , pwd, "HHosiYUNdG42t1cTgKOzIUPOvAVMI2QT", new AuthCallback() { + PolymerizeAgent.getInstance().getAuthenAPI().authentication("28110687C457" + , pwd, "YqggeKCxfEOVQGjUYrpQQdEstGpvojzn", new AuthCallback() { @Override public void onSuccess(String result) { isLogin = true; @@ -212,7 +225,7 @@ public class MainActivity extends AppCompatActivity { Toast.makeText(this,"请先鉴权",Toast.LENGTH_SHORT).show(); return; } - String in = "/sdcard/Android/data/com.zhixun.android.sdk.polymerizesdk/files/temp.msbc"; + String in = "/sdcard/Android/data/com.zhixun.android.sdk.polymerizesdk/files/2025-02-10_17-29-32.opus"; String out = "/sdcard/Android/data/com.zhixun.android.sdk.polymerizesdk/files/out.pcm"; File infile = new File(in); byte[] indata = readFile(infile); diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MyMediaPlayer.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MyMediaPlayer.java index 668e73b..f869e95 100644 --- a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MyMediaPlayer.java +++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/MyMediaPlayer.java @@ -48,7 +48,7 @@ public class MyMediaPlayer { new Thread(new Runnable() { @Override public void run() { - if (mediaPlayer.isPlaying()) { + if (mediaPlayer.isPlaying()||sourceList.size()>0) { try { File tempMp3 = File.createTempFile("temp_" + System.currentTimeMillis(), ".mp3"); // tempMp3.deleteOnExit(); @@ -99,7 +99,7 @@ public class MyMediaPlayer { mediaPlayer.prepare(); mediaPlayer.start(); } catch (Exception ex) { - String s = ex.toString(); + String s = ex.getMessage(); Log.d(TAG, "playData-2-" + s); ex.printStackTrace(); } diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/PicTestActivity.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/PicTestActivity.java index 3d6d039..d25f525 100644 --- a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/PicTestActivity.java +++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/PicTestActivity.java @@ -64,6 +64,7 @@ public class PicTestActivity extends AppCompatActivity { Log.i(TAG, "compressRetsFromJNI: id = " + id + " state = " + state + " tileWidth = " + tileWidth + " len = " + data.length); compressedFile = writeBuffer("ComRets" + tileWidth, data, 0, data.length); runOnUiThread(() -> btnCompress.setEnabled(true)); + runOnUiThread(() -> Toast.makeText(PicTestActivity.this,"压缩成功",Toast.LENGTH_SHORT).show()); } }); @@ -117,6 +118,7 @@ public class PicTestActivity extends AppCompatActivity { public void deCompressRets(int id, int state, Bitmap bitmapDe) { runOnUiThread(() -> destPic.setImageBitmap(bitmapDe)); + runOnUiThread(() -> Toast.makeText(PicTestActivity.this,"解压成功",Toast.LENGTH_SHORT).show()); } }); diff --git a/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/VoiceChatActivity.java b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/VoiceChatActivity.java new file mode 100644 index 0000000..09efda3 --- /dev/null +++ b/app/src/main/java/com/zhixun/android/sdk/polymerizesdk/VoiceChatActivity.java @@ -0,0 +1,53 @@ +package com.zhixun.android.sdk.polymerizesdk; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.os.Bundle; +import android.util.Log; +import android.view.View; + +import com.zhixun.android.sdk.polymerizesdk.adapter.MsgAdapter; +import com.zhixun.android.sdk.polysdk.PolymerizeAgent; +import com.zhixun.android.sdk.polysdk.ai.VoiceChatManager; + +import java.util.ArrayList; + +public class VoiceChatActivity extends AppCompatActivity { + + private String TAG = "VoiceChatActivity"; + private RecyclerView msg_listview; + private MsgAdapter msgAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_voice_chat); + msg_listview = findViewById(R.id.msg_listview); + + msgAdapter = new MsgAdapter(this,new ArrayList<>()); + msg_listview.setAdapter(msgAdapter); + LinearLayoutManager layoutManager = new LinearLayoutManager(this); + msg_listview.setLayoutManager(layoutManager); + +// VoiceChatManager.getInstance().start(); + } + + public void back(View view){ + finish(); + } + + + public void start(View view){ + VoiceChatManager.getInstance().startSend(); + AudioRecorderMan.getInstance().startRecording(this); + AudioRecorderMan.getInstance().setOnBuffChange(new AudioRecorderMan.onBuffChange() { + @Override + public void onChange(byte[] data) { + Log.i(TAG,"Audio-onChange-"+data.length); + VoiceChatManager.getInstance().sendVoice(data); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..10fb7fd 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index 2b068d1..98ce79a 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,30 +1,6 @@ - - - - - - - - - - + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml index 40944ef..41d008c 100644 --- a/app/src/main/res/layout/activity_chat.xml +++ b/app/src/main/res/layout/activity_chat.xml @@ -35,7 +35,7 @@ android:layout_weight="1" android:layout_height="match_parent" android:background="@null" - android:text="韩国启明大学2014届留学生有多少人"/> + android:text="写一篇关于夏天的300字作文"/>