Example #1
0
 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")
Example #2
0
 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")
Example #3
0
 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))
Example #4
0
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))