如何在Kotlin开发的Android应用中集成OpenAI Whisper模型?
在Kotlin Android应用中集成Whisper实现音频转文本
方案1:调用OpenAI Whisper API(推荐,快速落地)
这种方式无需本地部署模型,直接通过API请求完成转写,适合大多数移动端场景。
步骤1:添加网络请求依赖
在app/build.gradle.kts中添加OkHttp或Retrofit依赖:
dependencies { // OkHttp implementation("com.squareup.okhttp3:okhttp:4.12.0") // 或者Retrofit implementation("com.squareup.retrofit2:retrofit:2.9.0") implementation("com.squareup.retrofit2:converter-gson:2.9.0") }
步骤2:安全配置API密钥
将OpenAI的API密钥存储在local.properties中,避免硬编码:
OPENAI_API_KEY=your_api_key_here
在代码中读取密钥:
val apiKey = try { val properties = Properties() properties.load(FileInputStream(File(rootProject.rootDir, "local.properties"))) properties.getProperty("OPENAI_API_KEY") } catch (e: Exception) { null }
步骤3:处理音频文件
确保音频符合API要求的格式(如MP3、WAV),实时录音时建议设置采样率为16kHz、单通道,减少文件体积。
步骤4:发送API请求并解析结果
用OkHttp实现请求示例:
val client = OkHttpClient() val requestBody = MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("model", "whisper-1") .addFormDataPart("file", "audio.mp3", File("path/to/your/audio/file").asRequestBody(MediaType.parse("audio/mpeg"))) .addFormDataPart("response_format", "json") .build() val request = Request.Builder() .url("https://api.openai.com/v1/audio/transcriptions") .addHeader("Authorization", "Bearer $apiKey") .post(requestBody) .build() client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { // 处理请求失败逻辑 } override fun onResponse(call: Call, response: Response) { response.body?.let { body -> val json = body.string() val transcription = Gson().fromJson(json, TranscriptionResponse::class.java) val text = transcription.text // 切换到主线程更新UI runOnUiThread { // 显示转写结果 } } } }) // 对应的数据类 data class TranscriptionResponse(val text: String)
方案2:本地部署Whisper模型(离线场景)
如果需要离线运行,可使用适配移动端的Whisper TFLite模型,推荐用whisper-tiny或whisper-base以适配移动端性能。
步骤1:准备TFLite模型
下载适配Android的Whisper TFLite模型,将模型文件放在app/src/main/assets目录下。
步骤2:添加TFLite依赖
在app/build.gradle.kts中添加:
dependencies { implementation("org.tensorflow:tensorflow-lite:2.15.0") implementation("org.tensorflow:tensorflow-lite-support:0.4.4") }
步骤3:音频预处理
Whisper要求输入为16kHz单通道PCM音频,需将录制或上传的音频转换为该格式:
// 示例:将WAV文件转换为16kHz单通道PCM fun convertAudioToPCM(inputFile: File): FloatArray { val audioInputStream = AudioInputStream(inputFile) val format = AudioFormat( AudioFormat.ENCODING_PCM_FLOAT, 16000.0f, 32, 1, 4, 16000.0f, false ) val convertedStream = AudioSystem.getAudioInputStream(format, audioInputStream) val buffer = ByteArray(4096) val pcmData = mutableListOf<Float>() var bytesRead: Int while (convertedStream.read(buffer).also { bytesRead = it } != -1) { for (i in 0 until bytesRead step 4) { val floatValue = ByteBuffer.wrap(buffer, i, 4).order(ByteOrder.LITTLE_ENDIAN).float pcmData.add(floatValue) } } convertedStream.close() audioInputStream.close() return pcmData.toFloatArray() }
步骤4:运行模型推理
// 初始化TFLite模型 val model = TensorFlowLiteModel.fromFile(assets, "whisper-tiny.tflite") val interpreter = Interpreter(model) // 将PCM转换为Whisper要求的Mel频谱(需自行实现或用第三方库) val melSpectrogram = computeMelSpectrogram(pcmData) // 分配输入输出张量 val inputShape = interpreter.getInputTensor(0).shape() val outputShape = interpreter.getOutputTensor(0).shape() val inputBuffer = TensorBuffer.createFixedSize(inputShape, DataType.FLOAT32) val outputBuffer = TensorBuffer.createFixedSize(outputShape, DataType.FLOAT32) inputBuffer.loadArray(melSpectrogram) interpreter.run(inputBuffer.buffer, outputBuffer.buffer) // 解析输出结果获取转写文本 val transcription = decodeOutput(outputBuffer.floatArray)
注意事项
- 权限配置:在
AndroidManifest.xml中添加必要权限:<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> - 性能优化:本地部署时,在后台线程执行推理避免阻塞UI,优先选择轻量化模型。
- API成本:使用OpenAI API时需注意调用次数和音频时长对应的费用。
内容的提问来源于stack exchange,提问作者Valentine
相关产品推荐
相关产品推荐

