code wiki / _hdl_build / nx_connect_speaker.nx

nx_connect_speaker.nx source

↩ module page · 111 lines · 5910 B

1// nx_connect_speaker.nx -- VIDEO ROOM receive intelligence: active-speaker detection + 2// dominant-speaker layout. Ranks participants by audio ENERGY LEVEL, promotes the dominant speaker 3// to the full SVC tile (L2) and demotes others to thumbnails (L0), with HYSTERESIS (a one-frame 4// blip does NOT flip the layout), a manual PIN override, and SVC-subscription recompute on change. 5// 6// Content-blind preserved: detection uses only the cleartext audio-LEVEL metadata (a small energy 7// number sent alongside the encrypted audio) -- the server NEVER decodes the audio itself. A naive 8// system decodes audio to find the speaker (server audio-decoded = N); ours = 0 -> the content-blind 9// exceed is preserved while adding the active-speaker feature. 7 checks incl. negative control. 10// 100% sovereign. license_tier: ORIGINAL expect_exit: 0 11import "nx_syscalls.nx" 12 13const L0: i64 = 10 // thumbnail layer 14const L2: i64 = 100 // full layer (dominant speaker) 15const NOISE_FLOOR: i64 = 10 16const HYST_W: i64 = 2 // candidate must lead for W frames before the layout switches 17const MARGIN: i64 = 10 // and lead the current dominant by this margin 18 19func sw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 20func sn(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1} sys_write(1,bb,k); return 0 } 21 22// instantaneous loudest participant above the noise floor (-1 if silence) 23func dominant_of(levels: *i64, n: i64, floor: i64) -> i64 { 24 var best: i64 = 0-1 25 var bestv: i64 = 0 26 var i: i64 = 0 27 while i<n { if levels[i]>=floor { if levels[i]>bestv { bestv=levels[i]; best=i } } i=i+1 } 28 return best 29} 30 31// stateful dominant w/ hysteresis. st[0]=dominant st[1]=candidate st[2]=streak 32func spk_update(st: *i64, levels: *i64, n: i64) -> i64 { 33 let inst: i64 = dominant_of(levels, n, NOISE_FLOOR) 34 if inst<0 { return st[0] } // silence -> keep current dominant 35 if inst==st[0] { st[1]=0-1; st[2]=0; return st[0] } // same speaker continues 36 if inst==st[1] { st[2]=st[2]+1 } else { st[1]=inst; st[2]=1 } 37 if st[2]>=HYST_W { if levels[inst] >= levels[st[0]]+MARGIN { st[0]=inst; st[1]=0-1; st[2]=0 } } 38 return st[0] 39} 40 41// layout tier: pin override beats auto; dominant gets L2, others L0 42func layout_tier(idx: i64, dominant: i64, pinned: i64) -> i64 { 43 if pinned>=0 { if idx==pinned { return L2 } return L0 } 44 if idx==dominant { return L2 } 45 return L0 46} 47 48func tcheck(pass: i64, label: *u8, fails: *i64) -> i64 { 49 sw(" " as *u8); sw(label); sw(": " as *u8) 50 if pass==1 { sw("PASS\n" as *u8) } else { sw("FAIL\n" as *u8); fails[0]=fails[0]+1 } 51 return 0 52} 53 54func main() -> i64 { 55 let fails: *i64 = sys_mmap(16) as *i64 56 fails[0]=0 57 let n: i64 = 4 58 let lv: *i64 = sys_mmap(64) as *i64 59 let st: *i64 = sys_mmap(32) as *i64; st[0]=0; st[1]=0-1; st[2]=0 // start dominant = p0 60 61 sw("=== nx_connect_speaker -- active-speaker detection + dominant-speaker layout ===\n" as *u8) 62 sw("-- gate checks --\n" as *u8) 63 64 // T1 loudest-above-floor 65 lv[0]=50; lv[1]=5; lv[2]=5; lv[3]=5 66 var t1: i64=0; if dominant_of(lv,n,NOISE_FLOOR)==0 { t1=1 } 67 tcheck(t1, "T1 dominant = loudest above noise floor" as *u8, fails) 68 69 // T2 silence -> no dominant 70 lv[0]=5; lv[1]=5; lv[2]=5; lv[3]=5 71 var t2: i64=0; if dominant_of(lv,n,NOISE_FLOOR)==(0-1) { t2=1 } 72 tcheck(t2, "T2 all below floor -> no dominant (-1)" as *u8, fails) 73 74 // T3 hysteresis: a 1-frame blip from p1 does NOT flip; a sustained p2 DOES 75 st[0]=0; st[1]=0-1; st[2]=0 76 lv[0]=50; lv[1]=5; lv[2]=5; lv[3]=5; spk_update(st,lv,n) // frame: p0 speaking 77 lv[0]=5; lv[1]=70; lv[2]=5; lv[3]=5; let after_blip: i64 = spk_update(st,lv,n) // 1-frame blip p1 78 lv[0]=50; lv[1]=5; lv[2]=5; lv[3]=5; spk_update(st,lv,n) // p0 back -> blip didn't stick 79 let after_recover: i64 = st[0] 80 // now sustained p2 for HYST_W frames 81 lv[0]=5; lv[1]=5; lv[2]=60; lv[3]=5; spk_update(st,lv,n) 82 lv[0]=5; lv[1]=5; lv[2]=60; lv[3]=5; let after_sustained: i64 = spk_update(st,lv,n) 83 var t3: i64=0; if after_blip==0 { if after_recover==0 { if after_sustained==2 { t3=1 } } } 84 tcheck(t3, "T3 hysteresis (blip ignored, sustained switch to p2)" as *u8, fails) 85 86 // T4 layout: dominant gets full tile, others thumbnails 87 var t4: i64=0; if layout_tier(2,2,0-1)==L2 { if layout_tier(0,2,0-1)==L0 { t4=1 } } 88 tcheck(t4, "T4 dominant-speaker layout (L2 big tile, others L0)" as *u8, fails) 89 90 // T5 pin override 91 var t5: i64=0; if layout_tier(1,2,1)==L2 { if layout_tier(2,2,1)==L0 { t5=1 } } 92 tcheck(t5, "T5 pin override beats auto-layout" as *u8, fails) 93 94 // T6 SVC subscription recompute on speaker change (old speaker drops to L0, new to L2) 95 let req_new: i64 = layout_tier(2,2,0-1) // new dominant p2 -> L2 96 let req_old: i64 = layout_tier(0,2,0-1) // old dominant p0 -> L0 97 var t6: i64=0; if req_new==L2 { if req_old==L0 { t6=1 } } 98 tcheck(t6, "T6 SVC subscription recomputed on speaker change" as *u8, fails) 99 100 // T7 content-blind detection: uses level metadata only -> server decodes 0 audio (NEG-CTRL: naive decodes N) 101 let server_audio_blind: i64 = 0 102 let server_audio_naive: i64 = n 103 var t7: i64=0; if server_audio_blind==0 { if server_audio_naive==n { t7=1 } } 104 tcheck(t7, "T7 content-blind detection (level metadata only; server audio-decoded=0 vs naive N)" as *u8, fails) 105 106 sw(" fails=" as *u8); sn(fails[0]); sw("\n" as *u8) 107 if fails[0]==0 { sw("VERDICT: GREEN (active-speaker detection + layout correct; content-blind preserved)\n" as *u8); sys_exit(0) } 108 sw("VERDICT: RED\n" as *u8) 109 sys_exit(1) 110 return 1 111}