Expo / React Native 接入
对应示例:examples/react-native-expo
完整绑定见示例中的 expo-adapters.ts。
cd examples/react-native-expocp .env.example .env # 只配置你控制的策略网关 URLbun 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 缓冲 → 流式 ASRdelivery: 'turn'— 完整 WAV → batch ASR / Audio LLM
示例显式使用 audioLlmStartTiming: 'after_audio':完整用户音频就绪后,ASR
终句与 Audio LLM 回复请求并行启动,降低 user_audio_end 到
assistant_audio_start 的延迟。助手回复可能早于 asr_final;UI 和持久化应以
turnId 关联事件。该模式可能为随后被新语音取代的自然停顿提前产生付费请求,
因此服务端必须按用户、会话和 profile 设置预算、速率限制与幂等控制。
助手播放期间可暂停编码采集,但保留音量回调以继续 barge-in。细节见 runtime-react-native。
App 生命周期
Section titled “App 生命周期”示例在 App 离开 active 时调用 finish('app_background') 后 dispose(),从而停止
麦克风、请求与播放;回到前台后由用户显式开启新会话。Runtime 会取消在 stop()
之后才完成的异步麦克风 / 播放器初始化,并清理临时音频文件,避免后台资源泄漏。