|
import collections.abc |
|
from pathlib import Path |
|
from typing import Union |
|
|
|
import numpy as np |
|
from typeguard import check_argument_types |
|
|
|
from espnet2.fileio.read_text import read_2column_text |
|
|
|
|
|
class NpyScpWriter: |
|
"""Writer class for a scp file of numpy file. |
|
|
|
Examples: |
|
key1 /some/path/a.npy |
|
key2 /some/path/b.npy |
|
key3 /some/path/c.npy |
|
key4 /some/path/d.npy |
|
... |
|
|
|
>>> writer = NpyScpWriter('./data/', './data/feat.scp') |
|
>>> writer['aa'] = numpy_array |
|
>>> writer['bb'] = numpy_array |
|
|
|
""" |
|
|
|
def __init__(self, outdir: Union[Path, str], scpfile: Union[Path, str]): |
|
assert check_argument_types() |
|
self.dir = Path(outdir) |
|
self.dir.mkdir(parents=True, exist_ok=True) |
|
scpfile = Path(scpfile) |
|
scpfile.parent.mkdir(parents=True, exist_ok=True) |
|
self.fscp = scpfile.open("w", encoding="utf-8") |
|
|
|
self.data = {} |
|
|
|
def get_path(self, key): |
|
return self.data[key] |
|
|
|
def __setitem__(self, key, value): |
|
assert isinstance(value, np.ndarray), type(value) |
|
p = self.dir / f"{key}.npy" |
|
p.parent.mkdir(parents=True, exist_ok=True) |
|
np.save(str(p), value) |
|
self.fscp.write(f"{key} {p}\n") |
|
|
|
|
|
self.data[key] = str(p) |
|
|
|
def __enter__(self): |
|
return self |
|
|
|
def __exit__(self, exc_type, exc_val, exc_tb): |
|
self.close() |
|
|
|
def close(self): |
|
self.fscp.close() |
|
|
|
|
|
class NpyScpReader(collections.abc.Mapping): |
|
"""Reader class for a scp file of numpy file. |
|
|
|
Examples: |
|
key1 /some/path/a.npy |
|
key2 /some/path/b.npy |
|
key3 /some/path/c.npy |
|
key4 /some/path/d.npy |
|
... |
|
|
|
>>> reader = NpyScpReader('npy.scp') |
|
>>> array = reader['key1'] |
|
|
|
""" |
|
|
|
def __init__(self, fname: Union[Path, str]): |
|
assert check_argument_types() |
|
self.fname = Path(fname) |
|
self.data = read_2column_text(fname) |
|
|
|
def get_path(self, key): |
|
return self.data[key] |
|
|
|
def __getitem__(self, key) -> np.ndarray: |
|
p = self.data[key] |
|
return np.load(p) |
|
|
|
def __contains__(self, item): |
|
return item |
|
|
|
def __len__(self): |
|
return len(self.data) |
|
|
|
def __iter__(self): |
|
return iter(self.data) |
|
|
|
def keys(self): |
|
return self.data.keys() |
|
|