Skip to content

Commit 0a50411

Browse files
authored
Android voxtral audio selection UI (#91)
Add audio selection UI and handle prefill audio format for voxtral
1 parent 7a8eaef commit 0a50411

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

llm/android/LlamaDemo/app/src/main/java/com/example/executorchllamademo/MainActivity.java

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,12 @@
4545
import androidx.core.content.res.ResourcesCompat;
4646
import com.google.gson.Gson;
4747
import com.google.gson.reflect.TypeToken;
48+
import java.io.IOException;
4849
import java.lang.reflect.Type;
50+
import java.nio.ByteBuffer;
51+
import java.nio.ByteOrder;
52+
import java.nio.file.Files;
53+
import java.nio.file.Paths;
4954
import java.util.ArrayList;
5055
import java.util.List;
5156
import java.util.concurrent.Executor;
@@ -84,6 +89,7 @@ public class MainActivity extends AppCompatActivity implements Runnable, LlmCall
8489
private int promptID = 0;
8590
private Executor executor;
8691
private boolean sawStartHeaderId = false;
92+
private String mAudioFileToPrefill;
8793

8894
@Override
8995
public void onResult(String result) {
@@ -477,6 +483,22 @@ private void setupMediaButton() {
477483
mAudioButton.setOnClickListener(
478484
view -> {
479485
mAddMediaLayout.setVisibility(View.GONE);
486+
String[] audioFiles =
487+
SettingsActivity.listLocalFile("/data/local/tmp/audio/", new String[] {".bin"});
488+
AlertDialog.Builder audioFilePathBuilder = new AlertDialog.Builder(this);
489+
audioFilePathBuilder.setTitle("Select audio feature path");
490+
audioFilePathBuilder.setSingleChoiceItems(
491+
audioFiles,
492+
-1,
493+
(dialog, item) -> {
494+
mAudioFileToPrefill = audioFiles[item];
495+
mMessageAdapter.add(
496+
new Message(
497+
"Selected audio: " + mAudioFileToPrefill, false, MessageType.SYSTEM, 0));
498+
mMessageAdapter.notifyDataSetChanged();
499+
dialog.dismiss();
500+
});
501+
audioFilePathBuilder.create().show();
480502
});
481503
mCameraButton = requireViewById(R.id.cameraButton);
482504
mCameraButton.setOnClickListener(
@@ -773,8 +795,16 @@ public void run() {
773795
mCurrentSettingsFields.getModelType(),
774796
mCurrentSettingsFields.getBackendType())
775797
== ModelUtils.VISION_MODEL) {
776-
mModule.generate(
777-
finalPrompt, ModelUtils.VISION_MODEL_SEQ_LEN, MainActivity.this, false);
798+
if (mCurrentSettingsFields.getModelType() == ModelType.VOXTRAL
799+
&& mAudioFileToPrefill != null) {
800+
prefillVoxtralAudio(mAudioFileToPrefill, finalPrompt);
801+
mAudioFileToPrefill = null;
802+
mModule.generate(
803+
"", ModelUtils.VISION_MODEL_SEQ_LEN, MainActivity.this, false);
804+
} else {
805+
mModule.generate(
806+
finalPrompt, ModelUtils.VISION_MODEL_SEQ_LEN, MainActivity.this, false);
807+
}
778808
} else if (mCurrentSettingsFields.getModelType() == ModelType.LLAMA_GUARD_3) {
779809
String llamaGuardPromptForClassification =
780810
PromptFormat.getFormattedLlamaGuardPrompt(rawPrompt);
@@ -808,6 +838,28 @@ public void run() {
808838
mMessageAdapter.notifyDataSetChanged();
809839
}
810840

841+
private void prefillVoxtralAudio(String audioFeaturePath, String textPrompt) {
842+
try {
843+
byte[] byteData = Files.readAllBytes(Paths.get(audioFeaturePath));
844+
ByteBuffer buffer = ByteBuffer.wrap(byteData).order(ByteOrder.LITTLE_ENDIAN);
845+
int floatCount = byteData.length / Float.BYTES;
846+
float[] floats = new float[floatCount];
847+
848+
// Read floats from the buffer
849+
for (int i = 0; i < floatCount; i++) {
850+
floats[i] = buffer.getFloat();
851+
}
852+
int bins = 128;
853+
int frames = 3000;
854+
int batchSize = floatCount / (bins * frames);
855+
mModule.prefillPrompt("<s>[INST][BEGIN_AUDIO]");
856+
mModule.prefillAudio(floats, batchSize, bins, frames);
857+
mModule.prefillPrompt(textPrompt + "[/INST]");
858+
} catch (IOException e) {
859+
Log.e("AudioPrefill", "Audio file error");
860+
}
861+
}
862+
811863
@Override
812864
public void run() {
813865
runOnUiThread(

llm/android/LlamaDemo/app/src/main/java/com/example/executorchllamademo/SettingsActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ private static boolean fileHasExtension(String file, String[] suffix) {
389389
return Arrays.stream(suffix).anyMatch(entry -> file.endsWith(entry));
390390
}
391391

392-
private static String[] listLocalFile(String path, String[] suffix) {
392+
static String[] listLocalFile(String path, String[] suffix) {
393393
File directory = new File(path);
394394
if (directory.exists() && directory.isDirectory()) {
395395
File[] files = directory.listFiles((dir, name) -> (fileHasExtension(name, suffix)));

0 commit comments

Comments
 (0)