import numpy as np, sys
from scipy.io import wavfile
SR=8000
def load(p):
    sr,x=wavfile.read(p); assert sr==SR
    x=x.astype(np.float64)
    if x.ndim>1: x=x.mean(1)
    return x

def voiced_f0(x, fmin=70, fmax=400, frame=0.04, hop=0.02):
    n=int(frame*SR); h=int(hop*SR)
    lag_min=int(SR/fmax); lag_max=int(SR/fmin)
    f0س=[]
    f0=[]
    win=np.hanning(n)
    for i in range(0,len(x)-n,h):
        seg=x[i:i+n]
        if np.sqrt(np.mean(seg*seg))<200:  # skip quiet/silence (16-bit scale)
            continue
        seg=(seg-seg.mean())*win
        ac=np.correlate(seg,seg,'full')[n-1:]
        if ac[0]<=0: continue
        acn=ac/ac[0]
        region=acn[lag_min:lag_max]
        if len(region)==0: continue
        j=np.argmax(region)+lag_min
        # voicing: require strong periodicity
        if acn[j]<0.4: continue
        f0.append(SR/j)
    return np.array(f0)

def summ(name,x):
    f=voiced_f0(x)
    if len(f)<50:
        print(f"{name}: too few voiced frames ({len(f)})"); return None
    med=np.median(f)
    print(f"{name}: voiced_frames={len(f):5d}  medianF0={med:6.1f}Hz  IQR=[{np.percentile(f,25):.0f},{np.percentile(f,75):.0f}]")
    return med

sus=load('sus8k.wav')
fam=load('ref_family8k.wav')
yo=load('ref_yo8k.wav')

print("--- FAMILY GUY (voice cast baseline vs suspect FG region 0-540s) ---")
r=summ("ref  FG native", fam)
s=summ("suspect 0-540s ", sus[0:540*SR])
if r and s: print(f"   RATIO suspect/native = {s/r:.3f}")
print("--- RICK & MORTY (baseline vs suspect R&M region 900-1500s) ---")
r=summ("ref  R&M native", yo)
s=summ("suspect 900-1500", sus[900*SR:1500*SR])
if r and s: print(f"   RATIO suspect/native = {s/r:.3f}")
print("--- whole suspect cartoon region 0-3000s ---")
summ("suspect all", sus[0:3000*SR])
