You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:13:10