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

如何在Android/iOS原生电视遥控应用中实现语音助手功能?

电视遥控应用语音助手控制实现指南

核心调用顺序

语音助手的完整控制流程需严格按以下顺序执行:

  1. 唤醒语音助手:发送KEYCODE_SEARCH按键码(你已实现此步骤)
  2. 启动语音输入流:发送RemoteVoiceBegin指令,告知电视准备接收语音数据
  3. 传输语音数据:分块发送RemoteVoicePayload,传递录制好的语音PCM数据
  4. 结束语音输入:发送RemoteVoiceEnd指令,通知电视停止接收语音

参数设置与代码示例

通用参数说明

  • RemoteVoiceBegin需指定音频格式参数,大部分电视支持以下标准配置:
    • 采样率:16000Hz(主流语音识别标准,必选)
    • 位深:16bit(必选)
    • 声道数:1(单声道,必选)
  • RemoteVoicePayload每次传递的音频块建议为100-300ms的PCM数据(比如16kHz 16bit单声道下,200ms对应6400字节)
  • RemoteVoiceEnd一般无需额外参数,仅标记输入结束

Android 示例代码

// 1. 唤醒语音助手(已实现)
sendKeyEvent(KeyEvent.KEYCODE_SEARCH);

// 等待电视进入语音监听状态(建议150ms)
try {
    Thread.sleep(150);
} catch (InterruptedException e) {
    e.printStackTrace();
}

// 2. 发送RemoteVoiceBegin
Bundle beginConfig = new Bundle();
beginConfig.putInt("sample_rate", 16000);
beginConfig.putInt("bit_depth", 16);
beginConfig.putInt("channels", 1);
sendRemoteVoiceCommand(RemoteVoiceCommand.Type.BEGIN, beginConfig);

// 3. 分块发送语音PCM数据(audioData为录制好的PCM字节数组)
int chunkSize = 6400; // 对应200ms音频
for (int i = 0; i < audioData.length; i += chunkSize) {
    int endIndex = Math.min(i + chunkSize, audioData.length);
    byte[] audioChunk = Arrays.copyOfRange(audioData, i, endIndex);
    
    Bundle payloadData = new Bundle();
    payloadData.putByteArray("audio_data", audioChunk);
    sendRemoteVoiceCommand(RemoteVoiceCommand.Type.PAYLOAD, payloadData);
    
    // 模拟实时录音的发送间隔
    try {
        Thread.sleep(200);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

// 4. 发送RemoteVoiceEnd
sendRemoteVoiceCommand(RemoteVoiceCommand.Type.END, new Bundle());

iOS 示例代码

// 1. 唤醒语音助手(已实现)
sendKeyCode(.search)

// 等待电视响应(建议150ms)
Thread.sleep(forTimeInterval: 0.15)

// 2. 发送RemoteVoiceBegin
let beginParams: [String: Any] = [
    "sampleRate": 16000,
    "bitDepth": 16,
    "channels": 1
]
sendRemoteVoiceCommand(.begin, parameters: beginParams)

// 3. 分块发送语音PCM数据(recordPCMData()为自定义录音方法)
guard let audioData = recordPCMData() else { return }
let chunkSize = 6400
var offset = 0

while offset < audioData.count {
    let endOffset = min(offset + chunkSize, audioData.count)
    let audioChunk = audioData.subdata(in: offset..<endOffset)
    
    let payloadParams: [String: Any] = ["audioData": audioChunk]
    sendRemoteVoiceCommand(.payload, parameters: payloadParams)
    
    Thread.sleep(forTimeInterval: 0.2)
    offset = endOffset
}

// 4. 发送RemoteVoiceEnd
sendRemoteVoiceCommand(.end, parameters: [:])

关键注意事项

  • 音频格式匹配:必须确保发送的PCM格式与电视端要求一致,否则语音识别会失败;若不确定,优先使用16kHz/16bit/单声道配置
  • 时序控制:唤醒后需等待电视进入语音监听状态再发送RemoteVoiceBegin,避免指令丢失
  • 数据块大小:不要发送过大或过小的音频块,100-300ms的帧是平衡延迟和开销的最优选择
  • 异常处理:若语音传输中断(如连接断开),需立即发送RemoteVoiceEnd,防止电视一直处于监听状态

参考方向

  • 查看目标电视品牌的官方遥控SDK文档(如三星SmartThings、LG ThinQ等),里面会有语音控制协议的详细定义
  • 基于Android TV开发的话,可参考Android官方RemoteControlClient或TvInputService中关于语音输入的章节
  • 测试时可通过抓包分析电视端接收的指令格式,验证参数是否符合要求

内容的提问来源于stack exchange,提问作者Muhammad Asad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:40:54