共计 2444 个字符,预计需要花费 7 分钟才能阅读完成。
在移动应用开发中,语音识别功能越来越受欢迎,但商业 SDK 的高昂授权费用让很多开发者望而却步。本文将带你从零开始,使用 Google Speech-to-Text API 搭建一个完全免费的 Android 语音识别解决方案。

商业方案对比
首先,让我们看看主流语音识别服务的免费额度政策:
- Google Speech-to-Text API:每月前 60 分钟免费,支持超过 120 种语言
- Azure Cognitive Services:每月前 5 小时免费,但中文支持有限
- AWS Transcribe:每月前 60 分钟免费,但配置复杂
对于大多数应用来说,Google 的方案在免费额度、语言支持和易用性上都是最佳选择。
技术实现
1. 音频采集配置
使用 Android 的 MediaRecorder 进行音频采集时,关键配置如下:
val recorder = MediaRecorder().apply {setAudioSource(MediaRecorder.AudioSource.MIC)
setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)
setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)
setAudioSamplingRate(16000) // 必须 16kHz 以上
setAudioEncodingBitRate(16000)
setOutputFile(tempFile.path)
prepare()}
重要提示:采样率低于 16kHz 会导致识别准确率显著下降。
2. 网络请求实现
使用 OkHttp 实现分块传输和重试机制:
suspend fun recognizeSpeech(audioFile: File): String = withContext(Dispatchers.IO) {val client = OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.build()
val requestBody = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("audio", "audio.3gp",
audioFile.asRequestBody("audio/3gpp".toMediaType()))
.build()
val request = Request.Builder()
.url("https://speech.googleapis.com/v1/speech:recognize")
.addHeader("Authorization", "Bearer your_api_key")
.post(requestBody)
.build()
try {client.newCall(request).execute().use { response ->
if (!response.isSuccessful) throw IOException("Unexpected code $response")
parseResponse(response.body?.string() ?: "")
}
} catch (e: Exception) {
// 处理网络错误
""
}
}
3. 响应解析
Google API 返回的 JSON 结构示例及解析方法:
fun parseResponse(json: String): String {
return try {val jsonObject = JSONObject(json)
val results = jsonObject.getJSONArray("results")
results.getJSONObject(0)
.getJSONArray("alternatives")
.getJSONObject(0)
.getString("transcript")
} catch (e: Exception) {""}
}
性能优化
1. 音频预处理
使用 FFmpeg 进行降噪和压缩可以显著提高识别准确率和降低带宽消耗:
ffmpeg -i input.3gp -af "highpass=f=200,lowpass=f=3000" -ar 16000 output.flac
2. 网络延迟优化
我们在不同网络环境下测试了请求延迟:
- WiFi:平均 320ms
- 4G:平均 680ms
- 3G:平均 1200ms
建议在弱网环境下增加超时时间并实现本地缓存。
生产环境注意事项
1. 配额监控
// 在每次请求后更新使用量统计
val prefs = getSharedPreferences("speech_usage", MODE_PRIVATE)
prefs.edit().putInt("today_usage", currentUsage + duration).apply()
// 检查是否接近限额
if (prefs.getInt("today_usage", 0) > 50 * 60) { // 50 分钟
showQuotaWarning()}
2. 隐私合规
必须在使用前获取用户明确授权:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
并在运行时检查权限:
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {// 请求权限}
思考与延伸
虽然云端识别很方便,但在某些场景下(如简单的语音指令),使用 TensorFlow Lite 实现本地识别可能更合适。你可以考虑:
- 训练一个小型的语音指令模型
- 使用模型压缩技术减少体积
- 在本地实现基本的 ” 唤醒词 ” 检测
这样既能保护用户隐私,又能实现零延迟的简单指令识别。
希望这篇指南能帮助你快速实现免费且高效的语音识别功能。在实际应用中,记得根据你的具体需求调整参数和优化策略。
正文完
