跳转到内容

Expo / React Native 接入

对应示例:examples/react-native-expo

完整绑定见示例中的 expo-adapters.ts

Terminal window
cd examples/react-native-expo
cp .env.example .env # 只配置你控制的策略网关 URL
bun run start

推荐输入:16 kHz · mono · PCM16。Runtime 不硬依赖 Expo 包,由你注入小型接口:

import { createExpoRuntime } from '@ottervoice/runtime-react-native';
import { createVoiceSession } from '@ottervoice/core';
const runtime = createExpoRuntime({
input: { /* Expo AudioStream / 录音绑定 */ },
output: { /* AudioPlaylist / 播放绑定 */ },
});
const session = createVoiceSession({
mode: 'full_duplex',
audioLlmStartTiming: 'after_audio', // ASR 终句与回复生成并行,降低首响。
asrPartial: false, // 标准模式只做一次终句 ASR,避免客户端放大请求数。
runtime,
providers: { asr, audioLlm },
});

示例的 createMobileProviders() 始终返回统一的 providers.audioLlm

EXPO_PUBLIC_OTTERVOICE_BACKEND 服务端实现 客户端 Provider
composite(默认) 一次 /asr-llm-tts 请求执行 ASR → LLM → TTS audioLlm
native /audio-llm 原生语音模型;/asr 仅用于可选字幕 audioLlm + 可选 asr

切换后端不改变 Session、Runtime、事件或 UI;移动端没有经典的 ASR / LLM / TTS 三 Provider 通路。

采集分两路:

  • delivery: 'stream' — 小 PCM 缓冲 → 流式 ASR
  • delivery: 'turn' — 完整 WAV → batch ASR / Audio LLM

示例显式使用 audioLlmStartTiming: 'after_audio':完整用户音频就绪后,ASR 终句与 Audio LLM 回复请求并行启动,降低 user_audio_endassistant_audio_start 的延迟。助手回复可能早于 asr_final;UI 和持久化应以 turnId 关联事件。该模式可能为随后被新语音取代的自然停顿提前产生付费请求, 因此服务端必须按用户、会话和 profile 设置预算、速率限制与幂等控制。

助手播放期间可暂停编码采集,但保留音量回调以继续 barge-in。细节见 runtime-react-native

示例在 App 离开 active 时调用 finish('app_background')dispose(),从而停止 麦克风、请求与播放;回到前台后由用户显式开启新会话。Runtime 会取消在 stop() 之后才完成的异步麦克风 / 播放器初始化,并清理临时音频文件,避免后台资源泄漏。