中文|English A sample Android app using java code and whisper.cpp library to do voice-to-text transcriptions.
├── app
│ ├── .gitignore
│ ├── build.gradle
│ ├── libs
│ ├── proguard-rules.pro
│ ├── src
│ │ ├── androidTest
│ │ │ ├── java
│ │ │ │ ├── com
│ │ │ │ │ ├── litongjava
│ │ │ │ │ │ ├── whispercppandroidjavademo
│ │ │ │ │ │ │ ├── ExampleInstrumentedTest.java
│ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── assets
│ │ │ │ ├── logback.xml
│ │ │ │ ├── models
│ │ │ │ │ ├── ggml-tiny.bin
│ │ │ │ ├── samples
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── jfk.wav
│ │ │ ├── java
│ │ │ │ ├── com
│ │ │ │ │ ├── litongjava
│ │ │ │ │ │ ├── whisper
│ │ │ │ │ │ │ ├── cpp
│ │ │ │ │ │ │ │ ├── android
│ │ │ │ │ │ │ │ │ ├── java
│ │ │ │ │ │ │ │ │ │ ├── bean
│ │ │ │ │ │ │ │ │ │ │ ├── WhisperSegment.java
│ │ │ │ │ │ │ │ │ │ ├── demo
│ │ │ │ │ │ │ │ │ │ │ ├── MainActivity.java
│ │ │ │ │ │ │ │ │ │ │ ├── app
│ │ │ │ │ │ │ │ │ │ │ │ ├── App.java
│ │ │ │ │ │ │ │ │ │ │ ├── ui
│ │ │ │ │ │ │ │ │ │ ├── media
│ │ │ │ │ │ │ │ │ │ │ ├── WaveEncoder.java
│ │ │ │ │ │ │ │ │ │ ├── recoder
│ │ │ │ │ │ │ │ │ │ │ ├── Recorder.java
│ │ │ │ │ │ │ │ │ │ ├── services
│ │ │ │ │ │ │ │ │ │ │ ├── WhisperService.java
│ │ │ │ │ │ │ │ │ │ ├── single
│ │ │ │ │ │ │ │ │ │ │ ├── LocalWhisper.java
│ │ │ │ │ │ │ │ │ │ ├── utils
│ │ │ │ │ │ │ │ │ │ │ ├── AssetUtils.java
│ │ │ │ │ ├── whispercppdemo
│ │ │ │ │ │ ├── whisper
│ │ │ │ │ │ │ ├── CpuInfo.java
│ │ │ │ │ │ │ ├── WhisperContext.java
│ │ │ │ │ │ │ ├── WhisperCpuConfig.java
│ │ │ │ │ │ │ ├── WhisperLib.java
│ │ │ │ │ │ │ ├── WhisperUtils.java
│ │ │ ├── jniLibs
│ │ │ │ ├── arm64-v8a
│ │ │ │ │ ├── libwhisper.so
│ │ │ │ │ ├── libwhisper_v8fp16_va.so
│ │ │ │ ├── armeabi-v7a
│ │ │ │ │ ├── libwhisper.so
│ │ │ │ │ ├── libwhisper_vfpv4.so
│ │ │ │ ├── jniLibs.zip
│ │ │ │ ├── x86
│ │ │ │ │ ├── libwhisper.so
│ │ │ │ ├── x86_64
│ │ │ │ │ ├── libwhisper.so
│ │ │ ├── res
│ │ │ │ ├── drawable
│ │ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ ├── drawable-v24
│ │ │ │ │ ├── ic_launcher_foreground.xml
│ │ │ │ ├── layout
│ │ │ │ │ ├── activity_main.xml
│ │ │ │ ├── mipmap-anydpi-v26
│ │ │ │ │ ├── ic_launcher.xml
│ │ │ │ │ ├── ic_launcher_round.xml
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ ├── ic_launcher_round.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ ├── ic_launcher_round.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ ├── ic_launcher_round.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ ├── ic_launcher_round.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ │ ├── ic_launcher.png
│ │ │ │ │ ├── ic_launcher_round.png
│ │ │ │ ├── values
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ ├── themes.xml
│ │ │ │ ├── values-night
│ │ │ │ │ ├── themes.xml
│ │ ├── test
│ │ │ ├── java
│ │ │ │ ├── com
│ │ │ │ │ ├── litongjava
│ │ │ │ │ │ ├── whispercppandroidjavademo
│ │ │ │ │ │ │ ├── ExampleUnitTest.java
├── build
│ ├── intermediates
│ │ ├── lint-cache
│ │ │ ├── maven.google
│ │ │ │ ├── androidx
│ │ │ │ │ ├── appcompat
│ │ │ │ │ │ ├── group-index.xml
│ │ │ │ │ ├── constraintlayout
│ │ │ │ │ │ ├── group-index.xml
│ │ │ │ │ ├── legacy
│ │ │ │ │ │ ├── group-index.xml
│ │ │ │ │ ├── test
│ │ │ │ │ │ ├── espresso
│ │ │ │ │ │ │ ├── group-index.xml
│ │ │ │ │ │ ├── ext
│ │ │ │ │ │ │ ├── group-index.xml
│ │ │ │ ├── com
│ │ │ │ │ ├── google
│ │ │ │ │ │ ├── android
│ │ │ │ │ │ │ ├── material
│ │ │ │ │ │ │ │ ├── group-index.xml
│ │ │ │ ├── master-index.xml
│ │ │ ├── sdk-registry.xml
│ │ │ │ ├── sdk-registry.xml
├── build.gradle
├── gradle
│ ├── wrapper
│ │ ├── gradle-wrapper.jar
│ │ ├── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── local.properties
├── readme.md
├── readme_cn.md
├── settings.gradle
https://github.com/litongjava/whisper.cpp.android.java.demo/releases/tag/v1.0.0
-
cmake\obj\arm64-v8a\libwhisper_v8fp16_va.so
: This is the bare, unoptimized or stripped .so file. It may contain debugging information and unused code snippets. -
`AndroidWhisperCppLibrary-merged_native_libs.zip: This is the merged .so file, which may merge multiple native libraries, but may still contain debugging information.
-
AndroidWhisperCppLibrary-stripped_native_libs.zip
: This file has been "stripped", meaning that it no longer contains debugging information, and is therefore smaller in size. Stripped .so files are often used to reduce the size of the APK when distributing an application.
For debugging purposes, you can use the first or second file. However, if you intend to release or use it in other Android projects, it is recommended that you choose the third stripped file as it will be smaller in size and will not contain unnecessary debugging information.
So, for use in other Android projects, choose the AndroidWhisperCppLibrary-stripped_native_libs.zip
file. If you need to debug in other projects, then consider using the unstripped version.
# nm libwhisper_v8fp16_va.so |grep Java
U AAssetManager_fromJava
0000000000156700 T Java_com_whispercppdemo_whisper_WhisperLib_benchGgmlMulMat
00000000001566b0 T Java_com_whispercppdemo_whisper_WhisperLib_benchMemcpy
0000000000156390 T Java_com_whispercppdemo_whisper_WhisperLib_freeContext
00000000001563c4 T Java_com_whispercppdemo_whisper_WhisperLib_fullTranscribe
0000000000156668 T Java_com_whispercppdemo_whisper_WhisperLib_getSystemInfo
0000000000156608 T Java_com_whispercppdemo_whisper_WhisperLib_getTextSegment
00000000001565d4 T Java_com_whispercppdemo_whisper_WhisperLib_getTextSegmentCount
0000000000156314 T Java_com_whispercppdemo_whisper_WhisperLib_initContext
000000000015617c T Java_com_whispercppdemo_whisper_WhisperLib_initContextFromAsset
0000000000156024 T Java_com_whispercppdemo_whisper_WhisperLib_initContextFromInputStream
To use:
- Download AndroidWhisperCppLibrary-stripped_native_libs.zip unzip it to app\src\main\jniLibs
- From whisper.cpp library. 1 Select a model.
- Copy the model to the "app/src/main/assets/models" folder.
- Select a sample audio file (e.g. [jfk.wav] (https://github.com/ggerganov/whisper.cpp/raw/master/samples/jfk.wav)).
- Copy the sample to the "app/src/main/assets/samples" folder.
- Modify the modelFilePath in WhisperService.java.
- Modify the sampleFilePath in WhisperService.java 7.
- Select the "release" active build variant, then run and deploy to the device using Android Studio.
Modify app/build.gradle to add jniLibs to sourceSets
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
//litongjava
implementation 'com.litongjava:android-view-inject:1.0'
implementation 'com.litongjava:jfinal-aop:1.0.1'
implementation 'com.litongjava:litongjava-android-utils:1.0.0'
Footnotes
-
I recommend running
ggml-tiny.bin
on Android devices. ↩