def rir(self, fname, fs=16000, rir_nsamps=4096, v=340, gpu=False): """ Generate rir for current settings """ if gpu: # self.beta: rt60 beta = pygpurir.beta_SabineEstimation(self.size, self.beta) # NOTE: do not clear here # diff = pygpurir.att2t_SabineEstimator(15, self.beta) tmax = rir_nsamps / fs nb_img = pygpurir.t2n(tmax, self.size) # S x R x T rir = pygpurir.simulateRIR(self.size, beta, np.array(self.spos)[None, ...], np.array(self.rpos), nb_img, tmax, fs, mic_pattern="omni") write_wav(fname, rir[0], fs=fs) elif cpp_rir_available: # format float ffloat = lambda f: "{:.3f}".format(f) # location for each microphone loc_for_each_channel = [ ",".join(map(ffloat, p)) for p in self.rpos ] beta = ",".join(map(ffloat, self.beta)) if isinstance( self.beta, list) else round(self.beta, 3) run_command( "rir-simulate --sound-velocity={v} --samp-frequency={sample_rate} " "--hp-filter=true --number-samples={rir_samples} --beta={beta} " "--room-topo={room_size} --receiver-location=\"{receiver_location}\" " "--source-location={source_location} {dump_dest}".format( v=v, sample_rate=fs, rir_samples=rir_nsamps, room_size=",".join(map(ffloat, self.size)), beta=beta, receiver_location=";".join(loc_for_each_channel), source_location=",".join(map(ffloat, self.spos)), dump_dest=fname)) elif pyrirgen_available: rir = pyrirgen.generateRir(self.size, self.spos, self.rpos, soundVelocity=v, fs=fs, nDim=3, nSamples=rir_nsamps, nOrder=-1, reverbTime=self.beta, micType="omnidirectional", isHighPassFilter=True) if isinstance(rir, list): rir = np.stack(rir) write_wav(fname, rir, fs=fs) else: raise RuntimeError("Both rir-simulate and pyrirgen unavailable")
def rir(self, fname, fs=16000, rir_nsamps=4096, v=340): """ Generate rir for current settings """ if shutil.which("rir-simulate"): # format float ffloat = lambda f: "{:.3f}".format(f) # location for each microphone loc_for_each_channel = [ ",".join(map(ffloat, p)) for p in self.rpos ] beta = ",".join(map(ffloat, self.beta)) if isinstance( self.beta, list) else round(self.beta, 3) run_command( "rir-simulate --sound-velocity={v} --samp-frequency={sample_rate} " "--hp-filter=true --number-samples={rir_samples} --beta={beta} " "--room-topo={room_size} --receiver-location=\"{receiver_location}\" " "--source-location={source_location} {dump_dest}".format( v=v, sample_rate=fs, rir_samples=rir_nsamps, room_size=",".join(map(ffloat, self.size)), beta=beta, receiver_location=";".join(loc_for_each_channel), source_location=",".join(map(ffloat, self.spos)), dump_dest=fname)) elif pyrirgen_available: rir = pyrirgen.generateRir(self.size, self.spos, self.rpos, soundVelocity=v, fs=fs, nDim=3, nSamples=rir_nsamps, nOrder=-1, reverbTime=self.beta, micType="omnidirectional", isHighPassFilter=True) if isinstance(rir, list): rir = np.stack(rir) write_wav(fname, rir, fs=fs) else: raise RuntimeError("Both rir-simulate and pyrirgen unavailable")
def rir(self, dump_dest, fs=16000, rir_nsamps=4096, v=340): """ Generate rir for current settings """ # format float ffloat = lambda f: "{:.3f}".format(f) # location for each microphone loc_for_each_channel = [",".join(map(ffloat, p)) for p in self.rpos] beta = ",".join(map(ffloat, self.beta)) if isinstance( self.beta, list) else round(self.beta, 3) run_command( "rir-simulate --sound-velocity={v} --samp-frequency={sample_rate} " "--hp-filter=true --number-samples={rir_samples} --beta={beta} " "--room-topo={room_size} --receiver-location=\"{receiver_location}\" " "--source-location={source_location} {dump_dest}".format( v=v, sample_rate=fs, rir_samples=rir_nsamps, room_size=",".join(map(ffloat, self.size)), beta=beta, receiver_location=";".join(loc_for_each_channel), source_location=",".join(map(ffloat, self.spos)), dump_dest=dump_dest))
def run(args): config = open(args.dump_conf, "w") if args.dump_conf else None conf = parse_config(args) def sample_value(conf, key): return random.uniform(conf["{}_min".format(key)], conf["{}_max".format(key)]) def format_float(float_n): return "{:.3f}".format(float_n) if not os.path.exists(args.dump_dir): os.makedirs(args.dump_dir) logger.info( "This command will generate {:d} rirs in total, {:d} for each room". format(args.num_rirs * args.num_rooms, args.num_rirs)) for room_id in tqdm.trange(args.num_rooms, desc="Finished Rooms"): done_cur_room = 0 while True: if done_cur_room == args.num_rirs: break # generate configure for current room Rx, Ry, Rz = sample_value(conf, "Rx"), sample_value( conf, "Ry"), sample_value(conf, "Rz") # microphone location Mx, My = sample_value(conf, "Mx"), sample_value(conf, "My") # speaker location dst = sample_value(conf, "dst") # sample from 0-180 doa = random.uniform(0, np.pi) Sx = Mx + np.cos(doa) * dst Sy = My + np.sin(doa) * dst # check speaker location if 0 > Sx or Sx > Rx or 0 > Sy or Sy > Ry: continue # speaker and microphone height Sz = sample_value(conf, "Sz") Mz = sample_value(conf, "Mz") # check peaker and microphone height if Sz > Rz or Mz > Rz: continue done_cur_room += 1 source_location = ",".join(map(format_float, [Sx, Sy, Sz])) room_size = ",".join(map(format_float, [Rx, Ry, Rz])) # center position Mc = (conf["topo"][-1] - conf["topo"][0]) / 2 # coordinate of each channel loc_for_each_channel = [ ",".join(map(format_float, [Mx - Mc + x, My, Mz])) for x in conf["topo"] ] # compute reflection coefficient from absorption coefficient absc = sample_value(conf, "abs") refl = np.sqrt(1 - absc) if config: rir_conf = "Room={room_size}, Speaker={speaker_location}, " \ "Microphone={array_location}, Refl={refl}, DoA={doa}, Dst={dst}\n".format( doa=doa, refl=format_float(refl), dst=format_float(dst), room_size=room_size, speaker_location=source_location, array_location=",".join(map(format_float, [Mc, My, Mz]))) config.write(rir_conf) # generate rir using rir-simulate command run_command( "rir-simulate --sound-velocity=340 --samp-frequency={sample_rate} " "--hp-filter=true --number-samples={rir_samples} --beta={refl} " "--room-topo={room_size} --receiver-location=\"{receiver_location}\" " "--source-location={source_location} {dir}/Room{room_id}-{rir_id}.wav" .format( sample_rate=args.sample_rate, rir_samples=args.rir_samples, room_size=room_size, refl=",".join(map(format_float, [refl] * 6)), receiver_location=";".join(loc_for_each_channel), source_location=source_location, dir=args.dump_dir, room_id=room_id, rir_id=done_cur_room)) if config: config.close() logger.info("Generate {:d} rirs in total done".format( args.num_rirs * args.num_rooms))