Я подозреваю, что проблема связана с тем, как соединения WebSocket и LiveKit обрабатываются параллельно.
Все сообщения отладки указывают на то, что соединения успешны — я вижу, что события комнаты протекают нормально, а журналы подтверждают, что комната LiveKit правильно подключена. Однако, несмотря на эти положительные показатели, видеопоток периодически зависает без всякого предупреждения. Похоже, что соединение инициализируется правильно, но затем прекращает обновление или синхронизацию после запуска.
Сейчас я создаю облегченный прототип, используя JavaScript, встроенный непосредственно в HTML. Я тщательно просмотрел документацию HeyGen, но, к сожалению, четких указаний по решению этой конкретной проблемы нет. Кроме того, пример кода в документации выглядит некорректным: предоставленный аватар больше не доступен, и пример не работает успешно.
Я считаю, что проблема может возникнуть в этой строке:
Код: Выделить всё
await room.connect(sessionInfo.url, sessionInfo.access_token);
Вот мой фрагмент кода:
Код: Выделить всё
// ------------------------------------------------------
// 1️⃣ Create + Start a new streaming session via Flask
// ------------------------------------------------------
async function createNewSession() {
try {
updateStatus("🔄 Creating streaming session (v2)…");
const res = await fetch("/api/session/create", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
avatar_name: avatarID.value,
voice_id: voiceID.value,
}),
});
if (!res.ok) throw new Error("Backend /create failed");
const data = await res.json();
sessionInfo = {
session_id: data.session_id,
url: data.url,
access_token: data.access_token,
session_token: data.session_token,
livekit_agent_token: data.livekit_agent_token,
realtime_endpoint: data.realtime_endpoint,
};
updateStatus("✅ Session info received from server");
// --- Connect to LiveKit Room ---
room = new LivekitClient.Room({
adaptiveStream: true,
dynacast: true,
videoCaptureDefaults: {
resolution: LivekitClient.VideoPresets.h720.resolution,
},
});
// ✅ Track LiveKit connection status
room
.on(LivekitClient.RoomEvent.Connected, () => {
updateStatus("✅ [LiveKit] Connected");
})
.on(LivekitClient.RoomEvent.Reconnecting, () => {
updateStatus("⚠️ [LiveKit] Reconnecting…");
})
.on(LivekitClient.RoomEvent.Reconnected, () => {
updateStatus("🔁 [LiveKit] Reconnected");
})
.on(LivekitClient.RoomEvent.Disconnected, (reason) => {
updateStatus("❌ [LiveKit] Disconnected: " + reason);
})
.on(LivekitClient.RoomEvent.ConnectionStateChanged, (state) => {
updateStatus(`🔄 [LiveKit] state → ${state}`);
});
// Handle room events
room.on(LivekitClient.RoomEvent.DataReceived, (message) => {
const data = new TextDecoder().decode(message);
console.log("Room message:", JSON.parse(data));
});
// Handle media streams
mediaStream = new MediaStream();
room.on(LivekitClient.RoomEvent.TrackSubscribed, (track) => {
if (track.kind === "video" || track.kind === "audio") {
mediaStream.addTrack(track.mediaStreamTrack);
if (
mediaStream.getVideoTracks().length > 0 &&
mediaStream.getAudioTracks().length > 0
) {
mediaElement.srcObject = mediaStream;
mediaElement.autoplay = true;
//mediaElement.playsInline = true;
updateStatus("Media stream ready");
updateStatus(`🎬 Subscribed: ${track.kind}`);
}
}
});
// connect the vide lip-sync room
updateStatus("🔗 Connecting to LiveKit room…");
await room.connect(sessionInfo.url, sessionInfo.access_token);
updateStatus("✅ Connected to LiveKit room");
// connect the audio lip‑sync websocket
await connectWebSocket(sessionInfo.session_id, sessionInfo.session_token);
document.querySelector("#startBtn").disabled = true;
updateStatus("🚀 Session ready — send text to talk!");
} catch (err) {
console.error(err);
updateStatus(`❌ Error: ${err.message}`);
}
}
Я пробовал практически все — менять аватары, переключать голоса и настраивать различные параметры — но все равно сталкиваюсь с той же проблемой: видео зависает.
Аудиопоток, поступающий через соединение WebSocket, работает стабильно, но видео через комнату LiveKit нестабильно и иногда зависает или не синхронизируется должным образом.
Вот мои текущие настройки подключения:
Код: Выделить всё
json={
"version": "v2",
"avatar_id": "Tyler-insuit-20220721",
"voice": {"voice_id": "f5a3cb4edbfc4d37b5614ce118be7bc8",
"rate":1.0},
"quality": "high",
"video_encoding": "H264",
},
Подробнее здесь: https://stackoverflow.com/questions/797 ... nsistently
Мобильная версия