DiariZen / python /diarizen_sdk /example.py
inoryQwQ's picture
Upload folder using huggingface_hub
37c4768 verified
Raw
History Blame Contribute Delete
2.03 kB
"""Example: Run DiariZen segmentation on a WAV file."""
import argparse
import sys
import numpy as np
from diarizen_sdk import DiarizenSegmenter
from diarizen_sdk.postprocess import log_probs_to_probs, top_speakers_at_frame
def main():
parser = argparse.ArgumentParser(description="DiariZen speaker segmentation")
parser.add_argument("audio", help="Path to 16kHz mono WAV file")
parser.add_argument("--cnn-model", default="cnn_features.axmodel",
help="Path to CNN NPU model")
parser.add_argument("--backend-model", default="backend.onnx",
help="Path to backend ONNX model")
args = parser.parse_args()
# Load audio
try:
import soundfile as sf
audio, sr = sf.read(args.audio, dtype="float32")
except ImportError:
print("soundfile not available, using scipy.io.wavfile")
from scipy.io import wavfile
sr, audio = wavfile.read(args.audio)
audio = audio.astype(np.float32) / 32768.0
if audio.ndim > 1:
audio = audio[:, 0] # Use first channel
print(f"Audio: {len(audio)} samples @ {sr} Hz")
# Create segmenter and run
segmenter = DiarizenSegmenter(args.cnn_model, args.backend_model)
log_probs = segmenter(audio, sr)
print(f"Output shape: {log_probs.shape}")
print(f" Frames: {log_probs.shape[1]}, Classes: {log_probs.shape[2]}")
# Show results for key frames
probs = log_probs_to_probs(log_probs)
check_frames = [0, 50, 100, 150, 198]
print("\nTop-3 speaker classes per selected frame:")
for f in check_frames:
top = top_speakers_at_frame(log_probs, f, top_k=3)
items = ", ".join(f"cls {c}: {lp:.2f}" for c, lp in top)
print(f" Frame {f:3d}: {items}")
# Overall most active class
mean_probs = probs[0].mean(axis=0)
top_class = int(np.argmax(mean_probs))
print(f"\nMost active class overall: {top_class} "
f"(avg prob={mean_probs[top_class]:.4f})")
if __name__ == "__main__":
main()