如何将数组保存在与FBK Fairseq兼容的.npz结构中以进行直接语音翻译?



我用代码生成了一个带有numpy的npz文件夹np.savez(outpath + "/data.npz", **keywords)其中关键字是结构为:

"0" : array
"1" : array

每个数组都是一个 2D 数组,其中包含使用语音提取的 MFCC 特征。 例如,键 0 的数组具有形状 (518, 13(。

这是生成的 npz 文件夹的文件夹和文件名结构:

data.npz
0.npy
1.npy

由于我必须将 npz 文件馈送到序列建模工具包,以便在 pytorch 上构建语音翻译 FBK-Fairseq-ST,因此读取 npz 文件的函数如下所示:

def reader_npz(path):
with open(path, 'rb') as f:
shape = np.load(f)
for i in range(int(shape[0])):
yield torch.from_numpy(np.load(f))

我不得不按照 @V. Ayrat 的评论中的建议将行for i in range(int(shape["0"]))修改为for i in range(int(shape[0])),以避免关键错误。

问题是这会导致TypeError: only size-1 arrays can be converted to Python scalars,因为我正在向int提供 2D 数组。

事实上,如果我的 .npz 文件夹包含 100 个 npy 文件,shape=np.load(f)将导致一组从shape["0"]shape["99"]的 2D 数组。

我应该如何将 .npy 文件保存在 .npz 文件中,以使 .npz 文件夹可由上述 FAIR 的 fairseq 脚本中reader_npz(path)函数读取?

提前感谢!

我找到了一种方法来读取包含 .npy 文件中数组的 .npz 文件夹,方法是修改reader_npz函数,如下所示:

def reader_npz(path):
with open(path, 'rb') as f:
arrays = np.load(f)
for key in arrays:
yield torch.from_numpy(arrays[key])

arrays = np.load(f)将生成文件夹中的文件名列表。由于每个文件都包含一个 2D 数组,因此 2D 数组本身arrays[key],您可以通过打印arrays[key]进行测试:

print(arrays[key])
[[-1.7862251  -0.3740275   0.5878265  ...  0.56670946  0.23715064
0.28952855]
[-2.3202019  -0.3106088  -0.5866199  ... -0.57073885 -1.3251289
-0.05244343]
[-0.88320863  0.04667355 -1.7014104  ...  1.3024858   1.3273206
1.1638638 ]
...
[ 0.4545314  -0.93115485 -1.2533125  ...  0.32433906  0.31202883
0.11585686]
[ 0.04456866 -1.161861   -1.6719444  ...  1.4855083   0.38237372
0.26423842]
[-0.18203917 -0.2660923  -0.66291505 ... -1.3389368  -2.3973744
-0.84333473]]

相关内容

  • 没有找到相关文章

最新更新