feat(dictate): support configurable ASR backends
This commit is contained in:
@@ -38,12 +38,20 @@ class FakeNemoModel:
|
||||
class FakeConcreteParakeetModel:
|
||||
restored_path: str | None = None
|
||||
restored_location: object | None = None
|
||||
restored_bytes: bytes | None = None
|
||||
replace_before_restore: tuple[Path, bytes] | None = None
|
||||
restored: FakeNemoModel | None = None
|
||||
|
||||
@classmethod
|
||||
def restore_from(cls, restore_path: str, map_location: object) -> FakeNemoModel:
|
||||
cls.restored_path = restore_path
|
||||
cls.restored_location = map_location
|
||||
if cls.replace_before_restore is not None:
|
||||
path, replacement = cls.replace_before_restore
|
||||
replacement_path = path.with_suffix(".replacement")
|
||||
replacement_path.write_bytes(replacement)
|
||||
replacement_path.replace(path)
|
||||
cls.restored_bytes = Path(restore_path).read_bytes()
|
||||
self = FakeNemoModel()
|
||||
cls.restored = self
|
||||
return self
|
||||
@@ -57,6 +65,13 @@ class FakeNumpy(ModuleType):
|
||||
|
||||
|
||||
class NemoParakeetModelTests(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
FakeConcreteParakeetModel.restored_path = None
|
||||
FakeConcreteParakeetModel.restored_location = None
|
||||
FakeConcreteParakeetModel.restored_bytes = None
|
||||
FakeConcreteParakeetModel.replace_before_restore = None
|
||||
FakeConcreteParakeetModel.restored = None
|
||||
|
||||
def test_load_is_lazy_offline_applies_coding_terms_and_transcribes_in_memory_audio(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
model_path = Path(directory) / "parakeet.nemo"
|
||||
@@ -78,7 +93,8 @@ class NemoParakeetModelTests(unittest.TestCase):
|
||||
|
||||
self.assertEqual(os.environ["HF_HUB_OFFLINE"], "1")
|
||||
self.assertEqual(os.environ["TRANSFORMERS_OFFLINE"], "1")
|
||||
self.assertEqual(FakeConcreteParakeetModel.restored_path, str(model_path))
|
||||
self.assertRegex(FakeConcreteParakeetModel.restored_path or "", r"^/proc/self/fd/\d+$")
|
||||
self.assertEqual(FakeConcreteParakeetModel.restored_bytes, b"model")
|
||||
self.assertEqual(FakeConcreteParakeetModel.restored_location, "device:cuda")
|
||||
self.assertTrue(FakeConcreteParakeetModel.restored.eval_called)
|
||||
self.assertEqual(FakeConcreteParakeetModel.restored.to_device, "cuda")
|
||||
@@ -107,6 +123,22 @@ class NemoParakeetModelTests(unittest.TestCase):
|
||||
with self.assertRaisesRegex(ValueError, "128 UTF-8 bytes"):
|
||||
load_coding_terms(terms_path)
|
||||
|
||||
def test_load_uses_the_verified_inode_if_the_configured_path_is_replaced(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
model_path = Path(directory) / "parakeet.nemo"
|
||||
model_path.write_bytes(b"verified model")
|
||||
FakeConcreteParakeetModel.replace_before_restore = (model_path, b"replacement")
|
||||
with patch.dict(sys.modules, self.fake_modules(), clear=False):
|
||||
adapter = NemoParakeetModel(
|
||||
model_path,
|
||||
expected_sha256=hashlib.sha256(b"verified model").hexdigest(),
|
||||
)
|
||||
|
||||
adapter.load()
|
||||
|
||||
self.assertEqual(model_path.read_bytes(), b"replacement")
|
||||
self.assertEqual(FakeConcreteParakeetModel.restored_bytes, b"verified model")
|
||||
|
||||
def test_refuses_a_model_that_no_longer_matches_the_pinned_hash(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
model_path = Path(directory) / "parakeet.nemo"
|
||||
|
||||
Reference in New Issue
Block a user