diff --git a/app/api/voice/chat/route.ts b/app/api/voice/chat/route.ts index 9be54b1..23b1961 100644 --- a/app/api/voice/chat/route.ts +++ b/app/api/voice/chat/route.ts @@ -203,7 +203,19 @@ export async function POST(req: Request) { ] await saveHistory(agent, updatedHistory) - const cleaned = cleanForSpeech(stripFillers(finalText)) + // Убрать строки вида "get_weather ..." или "" которые иногда генерирует LLM + const filteredText = finalText + .split('\n') + .filter(line => { + const l = line.trim() + return !(/^(get_|set_|control_|create_|update_|delete_|cancel_)[a-z_]+\s/.test(l) || + l.startsWith(' ({ success: true })) } export async function GET() { - // Get current playback state - const data = await spotifyFetch('/me/player') - if (!data || !data.item) return NextResponse.json({ playing: false }) - return NextResponse.json({ - playing: data.is_playing, - track: data.item.name, - artist: data.item.artists?.map((a: any) => a.name).join(', '), - album: data.item.album?.name, - volume: data.volume_percent, - device: data.device?.name, - }) + try { + // Get current playback state + const data = await spotifyFetch('/me/player') + if (!data || !data.item) return NextResponse.json({ playing: false }) + return NextResponse.json({ + playing: data.is_playing, + track: data.item.name, + artist: data.item.artists?.map((a: any) => a.name).join(', '), + album: data.item.album?.name, + volume: data.volume_percent, + device: data.device?.name, + }) + } catch (e: any) { + if (e?.code === 'NO_ACTIVE_DEVICE' || e?.message === 'NO_ACTIVE_DEVICE') { + return NextResponse.json({ error: 'no_active_device', message: 'Нет активного устройства Spotify. Открой Spotify на телефоне или ноутбуке.' }, { status: 200 }) + } + return NextResponse.json({ error: String(e?.message || e) }, { status: 500 }) + } } export async function POST(req: NextRequest) { const body = await req.json() const { action, query, volume } = body + try { switch (action) { case 'play': if (query) { @@ -75,4 +87,10 @@ export async function POST(req: NextRequest) { default: return NextResponse.json({ error: 'unknown action' }, { status: 400 }) } + } catch (e: any) { + if (e?.code === 'NO_ACTIVE_DEVICE' || e?.message === 'NO_ACTIVE_DEVICE') { + return NextResponse.json({ error: 'no_active_device', message: 'Нет активного устройства Spotify. Открой Spotify на телефоне или ноутбуке.' }, { status: 200 }) + } + return NextResponse.json({ error: String(e?.message || e) }, { status: 500 }) + } } diff --git a/components/VoiceController.tsx b/components/VoiceController.tsx index c514ddf..c5ea8f0 100644 --- a/components/VoiceController.tsx +++ b/components/VoiceController.tsx @@ -114,6 +114,7 @@ export default function VoiceController() { model: 'v5', baseAssetPath: '/vad/', onnxWASMBasePath: '/vad/', + logLevel: 'error', ortConfig: (ort: any) => { ort.env.wasm.numThreads = 1 ort.env.wasm.simd = true