diff --git a/.env.example b/.env.example index 808b224db..563d0f0d5 100644 --- a/.env.example +++ b/.env.example @@ -1,8 +1,14 @@ -# Enviroment variables needed to connect to the LiveKit server. +# Environment variables needed to connect to the LiveKit server. LIVEKIT_API_KEY= LIVEKIT_API_SECRET= LIVEKIT_URL=wss://.livekit.cloud +# Optional API endpoint override. +NEXT_PUBLIC_CONN_DETAILS_ENDPOINT=/api/connection-details + +# Frontdesk room input tracks. +# Backend room input publishes room_video by default. +NEXT_PUBLIC_FRONTDESK_VIDEO_TRACK_NAME=room_video # Internally used environment variables APP_CONFIG_ENDPOINT= diff --git a/app-config.ts b/app-config.ts index 4c89198ea..30242c098 100644 --- a/app-config.ts +++ b/app-config.ts @@ -60,8 +60,10 @@ export interface AppConfig { showDefaultCameraPreview?: boolean; // 是否默认显示摄像头/视频输入预览 } +const XUNFEI_AUDIO_TRACK_NAME = 'xunfei_audio_track'; const ROOM_INPUT_AUDIO_TRACK_NAME = 'room_audio'; -const ROOM_INPUT_VIDEO_TRACK_NAME = 'room_video'; +const ROOM_INPUT_VIDEO_TRACK_NAME = + process.env.NEXT_PUBLIC_FRONTDESK_VIDEO_TRACK_NAME || 'room_video'; const BROWSER_VIDEO_TRACK_NAME = 'browser_video_track'; export function buildDefaultVideoTracks( isBrowserInput: boolean, @@ -140,7 +142,7 @@ export const APP_CONFIG_DEFAULTS: AppConfig = { agentName: undefined, // 音频过滤配置 - excludeAudioTracks: [ROOM_INPUT_AUDIO_TRACK_NAME], // 要排除的音频轨道名称列表 + excludeAudioTracks: [XUNFEI_AUDIO_TRACK_NAME, ROOM_INPUT_AUDIO_TRACK_NAME], // 要排除的音频轨道名称列表 // 调试配置 showAudioFilterDebug: process.env.NEXT_PUBLIC_SHOW_AUDIO_DEBUG === 'true' || false, // 是否显示音频过滤调试组件 @@ -154,7 +156,7 @@ export const APP_CONFIG_DEFAULTS: AppConfig = { enableSmartParticipantMatching: true, // 启用智能参与者匹配,解决自定义音频track的字幕显示问题 enableTranscriptionDebug: process.env.NEXT_PUBLIC_SHOW_TRANSCRIPTION_DEBUG === 'true' || false, // 转录调试日志 showTranscriptByDefault: true, // 默认显示字幕;文本输入栏由用户点击 text 按钮后展开 - userTranscriptionIdentities: ['room_audio_input'], // 用户转录身份标识(自定义音频track) + userTranscriptionIdentities: ['xunfei_service_agent', 'room_input', 'room_audio_input'], // 用户转录身份标识(自定义音频track) showParticipantNames: false, // 默认不显示参与者名称(user、agent-xxx等) // 视频轨道配置 diff --git a/hooks/useRoom.ts b/hooks/useRoom.ts index 4662cca4b..65fc62b79 100644 --- a/hooks/useRoom.ts +++ b/hooks/useRoom.ts @@ -8,7 +8,13 @@ import { readConnectionDetailsResponse } from '@/lib/connection-details-response export function useRoom(appConfig: AppConfig) { const aborted = useRef(false); - const room = useMemo(() => new Room(), []); + const room = useMemo( + () => + new Room({ + reconnectPolicy: { nextRetryDelayInMs: () => null }, + }), + [] + ); const [isSessionActive, setIsSessionActive] = useState(false); const handleBrowserVideoError = useCallback((error: Error) => { toastAlert({ @@ -134,6 +140,7 @@ export function useRoom(appConfig: AppConfig) { } if (appConfig.usesServerRoomInput) { + await room.localParticipant.setMicrophoneEnabled(false); return; }