将MUSAN噪声库制作成LMDB格式

将musan中的wav文件读出来写入lmdb中;

文章目录

  • lmdb内部存储结构
  • 代码如下
  • 运行
  • 输出
  • 附:lmdb操作

lmdb内部存储结构

  • key1 二进制存储: wav1 二进制存储
  • key2 二进制存储:wav2 二进制存储
  • 。。。
  • __keys__ 二进制存储: [key1, key2, …] pickle打包的二进制存储

代码如下

import glob
import wave
import lmdb
import pickle
import argparse
import os

def get_args():
    parser = argparse.ArgumentParser(description="load file to lmdb")
    parser.add_argument('--indir', required=True, help='root dir of files.')
    parser.add_argument('--outdir', required=True, help='lmdb out dir.', default="lmdb")
    parser.add_argument('--lmdb_size', default=20, help='lmdb size')
    args = parser.parse_args()
    return args

def trans_to_lmdb(indir, outdir, lmdb_size_G=20):
    i = 0
    keys=[]
    lmdb_size=lmdb_size_G*1024*1024*1024 # 20G
    env = lmdb.open(outdir, lmdb_size) # 创建/打开lmdb文件
    musan_lmdb = env.begin(write=True) # 打开lmdb写环境
    for wav_file in glob.iglob(indir+"/**/*.wav", recursive=True):
        with open(wav_file, 'rb') as fr:
            value = fr.read()
            # key需要根据自身需求进行修改
            key = wav_file.split("/")[-3] + "_" + wav_file.split("/")[-2] + "_" + wav_file.split("/")[-1].replace(".wav","")
            musan_lmdb.put(key.encode(), value)
            keys.append(key)
        i += 1
    # 将lmdb中的keys保存到pickle文件中
    with open('keys.pkl', 'wb') as f:
        pickle.dump(keys, f)
    # 将lmdb中的keys读取出来,这里读取出来是二进制格式,正好用于保存到lmdb中
    with open('keys.pkl', 'rb') as f:
        obj = f.read()
    musan_lmdb.put(b'__keys__', obj)
    musan_lmdb.commit() # 执行对lmdb的修改,即添加的key和音频文件,以及全部的keys
    env.close() # 关闭lmdb环境
    print("There are total {} wavfile in lmdb".format(len(pickle.loads(obj))))
    print("The tyepe of keys is {}".format(type(pickle.loads(obj))))
    print("total processed {} files.".format(i))


if __name__ == "__main__":
    args = get_args()
    if(not os.path.exists(args.outdir)):
        os.makedirs(args.outdir)
        print("make new dir: {}".format(args.outdir))
    else:
        print("{} dir exists.".format(args.outdir))
    trans_to_lmdb(args.indir, args.outdir)

lmdb中存储的都是二进制的;
key本身是字符串,存储时,将其转为二进制;
查找时也一样,需要使用二进制的key去查找;

运行

在musan目录下运行命令:

python generate_musan_lmdb.py --indir . --outdir temp_lmdb

输出

  • 当前目录下生成临时文件:keys.pkl,里面是使用pickle打包的keys list数据;
  • 输出目录中生成以下两个文件
    .
    ├── data.mdb
    └── lock.mdb

附:lmdb操作

# -*- coding: utf-8 -*- 
import lmdb 
  
env = lmdb.open("./train") 
# map_size定义最大储存容量,单位是kb,以下定义1TB容量 
# env = lmdb.open("./train", map_size=1099511627776) 
# env_db = lmdb.Environment('trainC') 
  
# 参数write设置为True才可以写入 
txn = env.begin(write=True) 
############################################添加、修改、删除数据 
  
# 添加数据和键值 
txn.put(key = '1', value = 'aaa') 
txn.put(key = '2', value = 'bbb') 
txn.put(key = '3', value = 'ccc') 
  
# 通过键值删除数据 
txn.delete(key = '1') 
  
# 修改数据 
txn.put(key = '3', value = 'ddd') 
  
# 通过commit()函数提交更改 
txn.commit() 
############################################查询lmdb数据 
txn = env.begin() 
  
# get函数通过键值查询数据 
print txn.get(str(2)) 
  
# 通过cursor()遍历所有数据和键值 
for key, value in txn.cursor(): 
  print (key, value) 
    
############################################ 
  
env.close()

参考链接: https://blog.csdn.net/devil_son1234/article/details/122625703
lmdb文件的读取可以参考:https://github.com/wenet-e2e/wekws/blob/main/wekws/dataset/lmdb_data.py

你可能感兴趣的:(python,java,深度学习)