Android 集成文档

最近更新时间:2023-06-26 15:32:38 前往 Coding 编辑

导出文档

语音转译(translation) 集成步骤

1. 把模型(bin格式)文件导入到 assets 目录内

2. 添加 armeabi-v7a 架构的 so包

把 so 包 复制到 libs目录中,并在 build.gradle 中配置,并在 manifest 文件中添加 录音 权限

ndk {
    abiFilters 'armeabi-v7a'
}
<uses-permission android:name="android.permission.RECORD_AUDIO" />

3. 创建 com.neunit.winner.whisper 目录,把 LibWhisper.kt 文件复制到该目录

4. 录音或选择文件(仅支持 wav 格式)

5. 通过 RiffWaveHelper 中的 decodeWaveFile() 方法 获取到文件的流信息

suspend fun decodeWaveFile(file: File): FloatArray = withContext(scope.coroutineContext) {
    val baos = ByteArrayOutputStream()
    file.inputStream().use { it.copyTo(baos) }
    val buffer = ByteBuffer.wrap(baos.toByteArray())
    buffer.order(ByteOrder.LITTLE_ENDIAN)
    buffer.position(44)
    val shortBuffer = buffer.asShortBuffer()
    val shortArray = ShortArray(shortBuffer.limit())
    shortBuffer.get(shortArray)
    return@withContext FloatArray(shortArray.size) { index ->
        (shortArray[index] / 32767.0f).coerceIn(-1f..1f)
    }
}

6. 调用 LibWhisper.kt 中的 WhisperContext.createContextFromAsset() 方法加载模型文件,获取到 WhisperContext 对象

whisperContext = WhisperContext.createContextFromAsset(application.assets, "models/${models[0]}")

7. 调用 WhisperContext 的 transcribeData() 方法,参数为 (5) 中获取到的流信息,返回值即为转译结果

val result = whisperContext?.transcribeData(floatArrayData)

8. 在页面销毁时,调用release()释放资源

CoroutineScope(Dispatchers.IO).launch {
    whisperContext?.release()
}

9. 可通过FFmpeg转换音频格式

添加依赖

implementation 'com.github.microshow:RxFFmpeg:4.9.0-lite'

转换文件格式

changeFileFormatToWav()

10. 如果开启了代码混淆,且依赖了ffmpeg,需在proguard-rules.pro中添加如下代码

-dontwarn io.microshow.rxffmpeg.**
-keep class io.microshow.rxffmpeg.**{*;}