From ceb64f89a1264e2dd3feafd0bd02e4abd38715d2 Mon Sep 17 00:00:00 2001 From: imonlinux <39863321+imonlinux@users.noreply.github.com> Date: Sat, 13 Sep 2025 23:17:31 -0700 Subject: [PATCH] OWW model tester attempts to find models that would stop OWW from starting --- wyoming-openwakeword/test_oww_models.py | 73 ++++++++++++++++++++++++ wyoming-openwakeword/test_oww_models.txt | 19 ++++++ 2 files changed, 92 insertions(+) create mode 100644 wyoming-openwakeword/test_oww_models.py create mode 100644 wyoming-openwakeword/test_oww_models.txt diff --git a/wyoming-openwakeword/test_oww_models.py b/wyoming-openwakeword/test_oww_models.py new file mode 100644 index 0000000..4cc184e --- /dev/null +++ b/wyoming-openwakeword/test_oww_models.py @@ -0,0 +1,73 @@ + +#!/usr/bin/env python3 +import os +import time +import argparse +from pathlib import Path + +def try_import_tflite(): + try: + from tflite_runtime.interpreter import Interpreter + return Interpreter + except ImportError: + try: + from ai_edge_litert.interpreter import Interpreter + return Interpreter + except ImportError: + raise ImportError("Neither tflite_runtime nor ai_edge_litert is installed.") + +def test_model(model_path, Interpreter): + try: + start = time.time() + interpreter = Interpreter(model_path=str(model_path)) + interpreter.allocate_tensors() + elapsed = time.time() - start + return True, f"OK (loaded in {elapsed:.2f}s)" + except Exception as e: + return False, f"FAIL ({str(e)})" + +def main(): + parser = argparse.ArgumentParser(description="Test all TFLite models in a directory.") + parser.add_argument("--models-dir", type=str, default=str(Path.home() / "wyoming-openwakeword" / "wyoming_openwakeword" / "models"), + help="Path to the models directory") + parser.add_argument("--skip-non-detection", action="store_true", + help="Skip known non-detection models (embedding_model.tflite, melspectrogram.tflite)") + parser.add_argument("--quiet", action="store_true", help="Only show failures") + parser.add_argument("--csv", type=str, help="Output results to CSV file") + + args = parser.parse_args() + models_dir = Path(args.models_dir) + + Interpreter = try_import_tflite() + + if not models_dir.exists(): + print(f"Models directory not found: {models_dir}") + return + + skip_list = {"embedding_model.tflite", "melspectrogram.tflite"} + results = [] + + for model_file in sorted(models_dir.glob("*.tflite")): + if args.skip_non_detection and model_file.name in skip_list: + if not args.quiet: + print(f"SKIP {model_file.name}") + continue + + ok, message = test_model(model_file, Interpreter) + results.append((model_file.name, ok, message)) + + if not args.quiet or not ok: + status = "PASS" if ok else "FAIL" + print(f"{status} {model_file.name}: {message}") + + if args.csv: + import csv + with open(args.csv, "w", newline="") as f: + writer = csv.writer(f) + writer.writerow(["Model", "Status", "Message"]) + for name, ok, msg in results: + writer.writerow([name, "PASS" if ok else "FAIL", msg]) + print(f"Results written to {args.csv}") + +if __name__ == "__main__": + main() diff --git a/wyoming-openwakeword/test_oww_models.txt b/wyoming-openwakeword/test_oww_models.txt new file mode 100644 index 0000000..2494884 --- /dev/null +++ b/wyoming-openwakeword/test_oww_models.txt @@ -0,0 +1,19 @@ +cd wyoming-openwakeword/ +source .venv/bin/activate +python3 ~/linux-voice-assistant/wyoming-openwakeword/test_oww_models.py --skip-non-detection --models-dir /home/pi/wyoming-openwakeword/wyoming_openwakeword/models +deactivate + + + +# basic +python3 test_oww_models.py + +# skip non-detection models +python3 test_oww_models.py --skip-non-detection + +# specify a custom folder +python3 test_oww_models.py --models-dir /home/pi/wyoming-openwakeword/wyoming_openwakeword/models + +# quiet mode + CSV +python3 test_oww_models.py --quiet --csv /home/pi/model_check.csv +