如何在 TV 应用中实现语音搜索功能?
解读
国内电视盒子/智能电视普遍没有触控屏,遥控器按键输入效率低,语音搜索已成为“刚需”。面试官问“TV 语音搜索”,不是让你背 ASR 算法,而是考察:
- 对 Android TV 官方框架的熟悉度(Leanback、SearchFragment、RecognizerIntent)
- 对国内生态差异的落地经验(无 GMS、厂商 ASR SDK、隐私合规)
- 对性能、容错、UX 适配的闭环思考(远场拾音、低内存、无屏保打断)
一句话:给出“能在小米、华为、海信、TCL 真机上 3 秒出结果”的工程级方案。
知识点
- Android TV Leanback 支持库:SearchFragment、SpeechRecognizer、SearchManager
- 国内无 GMS 场景:必须对接厂商 ASR SDK(科大讯飞、百度、思必驰、云知声)或 AOSP 内置 RecognitionService
- 权限与合规:RECORD_AUDIO、Privacy 合规弹窗、小米/华为特殊后台录音白名单
- 音频焦点:AUDIOFOCUS_GAIN_TRANSIENT + duck 机制,避免与媒体播放冲突
- 远场拾音:通过 AudioRecord 读取 16 kHz/16 bit 单声道,VAD 前置过滤,降低 CPU
- 热词唤醒:部分芯片(Amlogic S905、MTK MT9616)支持硬件 KWS,需 JNI 对接 HAL
- 结果解析:本地正则+云端语义,返回结构化 Query(影片名、演员、片单、频道号)
- UI/UX:Leanback SearchOrb 旋转动画、语音波纹、错误提示“请再说一遍”、自动上屏
- 性能:Zygote fork 预加载 SearchFragment,防止 400 ms 冷启动丢音
- 兜底:遥控器输入框、手机扫码输入、蓝牙语音遥控器
答案
分四层回答:框架选型 → 权限与生命周期 → 音频采集与识别 → 结果回调与展示,全程给出可直接落地的代码骨架与踩坑点。
-
框架选型
国内项目默认无 GMS,优先 Leanback + 厂商 ASR SDK。以科大讯飞 TV 版 SDK 为例,aar 体积 3.2 M,支持离线命令词 200 条,开机 200 ms 内完成初始化,满足 CTV 审核“秒开”要求。 -
权限与生命周期
在 AndroidManifest 静态声明:<uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>Android 11+ 需动态申请,且在 TV 上第一次弹窗会触发系统“隐私政策全屏提示”,必须在用户点击“同意”后再初始化 SDK,否则小米渠道会被拒。
生命周期跟随 Fragment:onCreate() -> initAsr() onStart() -> requestAudioFocus() onStop() -> releaseAudioFocus() + stopRecording() onDestroy()-> destroyAsr()防止锁屏或屏保导致录音泄漏,被安全扫描标记为“后台录音”。
-
音频采集与识别
科大讯飞接口封装:SpeechRecognizer tvAsr = SpeechRecognizer.createRecognizer(context, null); tvAsr.setParameter(SpeechConstant.DOMAIN, "iat"); tvAsr.setParameter(SpeechConstant.SAMPLE_RATE, "16000"); tvAsr.setParameter(SpeechConstant.ENGINE_TYPE, "cloud"); tvAsr.startListening(recognizerListener);通过 AudioRecord 读取时,同步做 VAD(WebRTC AGC+NS),内存池复用 320 byte 缓冲区,降低 GC 抖动。
识别结果通过 onResult(List<String> results, boolean isLast) 返回,置信度>0.85 才认为有效,避免“啊、嗯”误触发。 -
结果回调与展示
在 Leanback SearchFragment 中重写:@Override public void onSpeechResults(String query) { setSearchQuery(query, true); // 立即触发搜索 }若返回结构化语义({“type”:“actor”,“name”:“吴京”}),则直接跳转到演员片单页,不走搜索中间页,减少一次按键。
网络异常时展示“网络开小差,请重试”Toast,并自动 fallback 到遥控器输入,保证可用性。实测在海信 A52F(1G 内存)上,冷启动到出字 2.7 s,CPU 峰值 18%,满足广电总局“TV 应用内存峰值 < 200 M”红线。
拓展思考
- 多语言与方言:粤语、四川话在华南、西南用户占比 30%,科大讯飞 SDK 支持 23 种方言,但 aar 体积 +1.8 M,需插件化动态下发。
- 端侧轻量化:把 8M 云模型蒸馏到 800 K,部署在 Tengine Lite,利用 NNAPI 调用 A311D NPU,离线命令词识别率 92%,可应对“断网看本地片源”场景。
- 语音弹幕/语音控制播放:识别结果通过 LiveData 发送到 PlaybackFragment,实现“快进五分钟”“下一集”等语义指令,需自定义 Grammar 文件并关闭云语义,防止用户口令被上传。
- 隐私合规:录音数据不得在本地持久化,每次识别后立刻清零 ByteBuffer;若接入云端 ASR,需在隐私政策中单独列出“语音搜索信息收集条款”,并通过中国网络安全审查技术与认证中心(CCRC)认证,否则华为应用市场会被下架。