#!/usr/bin/env python3
#
# Copyright (c)  2021  Xiaomi Corporation (authors: Fangjun Kuang)


import torch

import kaldifeat


def test_default():
    opts = kaldifeat.FbankOptions()
    assert opts.frame_opts.samp_freq == 16000
    assert opts.frame_opts.frame_shift_ms == 10.0
    assert opts.frame_opts.frame_length_ms == 25.0
    assert opts.frame_opts.dither == 1.0
    assert abs(opts.frame_opts.preemph_coeff - 0.97) < 1e-6
    assert opts.frame_opts.remove_dc_offset is True
    assert opts.frame_opts.window_type == "povey"
    assert opts.frame_opts.round_to_power_of_two is True
    assert abs(opts.frame_opts.blackman_coeff - 0.42) < 1e-6
    assert opts.frame_opts.snip_edges is True

    assert opts.mel_opts.num_bins == 23
    assert opts.mel_opts.low_freq == 20
    assert opts.mel_opts.high_freq == 0
    assert opts.mel_opts.vtln_low == 100
    assert opts.mel_opts.vtln_high == -500
    assert opts.mel_opts.debug_mel is False
    assert opts.mel_opts.htk_mode is False

    assert opts.use_energy is False
    assert opts.energy_floor == 0.0
    assert opts.raw_energy is True
    assert opts.htk_compat is False
    assert opts.use_log_fbank is True
    assert opts.use_power is True
    assert opts.device.type == "cpu"


def test_set_get():
    opts = kaldifeat.FbankOptions()
    opts.use_energy = True
    assert opts.use_energy is True

    opts.energy_floor = 1
    assert opts.energy_floor == 1

    opts.raw_energy = False
    assert opts.raw_energy is False

    opts.htk_compat = True
    assert opts.htk_compat is True

    opts.use_log_fbank = False
    assert opts.use_log_fbank is False

    opts.use_power = False
    assert opts.use_power is False

    opts.device = torch.device("cuda", 1)
    assert opts.device.type == "cuda"
    assert opts.device.index == 1


def test_set_get_frame_opts():
    opts = kaldifeat.FbankOptions()

    opts.frame_opts.samp_freq = 44100
    assert opts.frame_opts.samp_freq == 44100

    opts.frame_opts.frame_shift_ms = 20.5
    assert opts.frame_opts.frame_shift_ms == 20.5

    opts.frame_opts.frame_length_ms = 1
    assert opts.frame_opts.frame_length_ms == 1

    opts.frame_opts.dither = 0.5
    assert opts.frame_opts.dither == 0.5

    opts.frame_opts.preemph_coeff = 0.25
    assert opts.frame_opts.preemph_coeff == 0.25

    opts.frame_opts.remove_dc_offset = False
    assert opts.frame_opts.remove_dc_offset is False

    opts.frame_opts.window_type = "hanning"
    assert opts.frame_opts.window_type == "hanning"

    opts.frame_opts.round_to_power_of_two = False
    assert opts.frame_opts.round_to_power_of_two is False

    opts.frame_opts.blackman_coeff = 0.25
    assert opts.frame_opts.blackman_coeff == 0.25

    opts.frame_opts.snip_edges = False
    assert opts.frame_opts.snip_edges is False


def test_set_get_mel_opts():
    opts = kaldifeat.FbankOptions()

    opts.mel_opts.num_bins = 100
    assert opts.mel_opts.num_bins == 100

    opts.mel_opts.low_freq = 22
    assert opts.mel_opts.low_freq == 22

    opts.mel_opts.high_freq = 1
    assert opts.mel_opts.high_freq == 1

    opts.mel_opts.vtln_low = 101
    assert opts.mel_opts.vtln_low == 101

    opts.mel_opts.vtln_high = -100
    assert opts.mel_opts.vtln_high == -100

    opts.mel_opts.debug_mel = True
    assert opts.mel_opts.debug_mel is True

    opts.mel_opts.htk_mode = True
    assert opts.mel_opts.htk_mode is True


def test_from_empty_dict():
    opts = kaldifeat.FbankOptions.from_dict({})
    opts2 = kaldifeat.FbankOptions()

    assert str(opts) == str(opts2)


def test_from_dict_partial():
    d = {
        "energy_floor": 10.5,
        "htk_compat": True,
        "mel_opts": {"num_bins": 80, "vtln_low": 1},
        "frame_opts": {"window_type": "hanning"},
    }
    opts = kaldifeat.FbankOptions.from_dict(d)
    assert opts.energy_floor == 10.5
    assert opts.htk_compat is True
    assert opts.mel_opts.num_bins == 80
    assert opts.mel_opts.vtln_low == 1
    assert opts.frame_opts.window_type == "hanning"

    mel_opts = kaldifeat.MelBanksOptions.from_dict(d["mel_opts"])
    assert str(opts.mel_opts) == str(mel_opts)


def test_from_dict_full_and_as_dict():
    opts = kaldifeat.FbankOptions()
    opts.htk_compat = True
    opts.mel_opts.num_bins = 80
    opts.frame_opts.samp_freq = 10

    d = opts.as_dict()
    assert d["htk_compat"] is True
    assert d["mel_opts"]["num_bins"] == 80
    assert d["frame_opts"]["samp_freq"] == 10

    mel_opts = kaldifeat.MelBanksOptions()
    mel_opts.num_bins = 80
    assert d["mel_opts"] == mel_opts.as_dict()

    frame_opts = kaldifeat.FrameExtractionOptions()
    frame_opts.samp_freq = 10
    assert d["frame_opts"] == frame_opts.as_dict()

    opts2 = kaldifeat.FbankOptions.from_dict(d)
    assert str(opts2) == str(opts)

    d["htk_compat"] = False
    d["device"] = torch.device("cuda", 2)
    opts3 = kaldifeat.FbankOptions.from_dict(d)
    assert opts3.htk_compat is False
    assert opts3.device == torch.device("cuda", 2)


def main():
    test_default()
    test_set_get()
    test_set_get_frame_opts()
    test_set_get_mel_opts()
    test_from_empty_dict()
    test_from_dict_partial()
    test_from_dict_full_and_as_dict()


if __name__ == "__main__":
    main()

80b32f6be9757a52a8091ccdfe6c5d4ff013316a
<mask token>


def test_set_get():
    opts = kaldifeat.FbankOptions()
    opts.use_energy = True
    assert opts.use_energy is True
    opts.energy_floor = 1
    assert opts.energy_floor == 1
    opts.raw_energy = False
    assert opts.raw_energy is False
    opts.htk_compat = True
    assert opts.htk_compat is True
    opts.use_log_fbank = False
    assert opts.use_log_fbank is False
    opts.use_power = False
    assert opts.use_power is False
    opts.device = torch.device('cuda', 1)
    assert opts.device.type == 'cuda'
    assert opts.device.index == 1


def test_set_get_frame_opts():
    opts = kaldifeat.FbankOptions()
    opts.frame_opts.samp_freq = 44100
    assert opts.frame_opts.samp_freq == 44100
    opts.frame_opts.frame_shift_ms = 20.5
    assert opts.frame_opts.frame_shift_ms == 20.5
    opts.frame_opts.frame_length_ms = 1
    assert opts.frame_opts.frame_length_ms == 1
    opts.frame_opts.dither = 0.5
    assert opts.frame_opts.dither == 0.5
    opts.frame_opts.preemph_coeff = 0.25
    assert opts.frame_opts.preemph_coeff == 0.25
    opts.frame_opts.remove_dc_offset = False
    assert opts.frame_opts.remove_dc_offset is False
    opts.frame_opts.window_type = 'hanning'
    assert opts.frame_opts.window_type == 'hanning'
    opts.frame_opts.round_to_power_of_two = False
    assert opts.frame_opts.round_to_power_of_two is False
    opts.frame_opts.blackman_coeff = 0.25
    assert opts.frame_opts.blackman_coeff == 0.25
    opts.frame_opts.snip_edges = False
    assert opts.frame_opts.snip_edges is False


<mask token>


def test_from_empty_dict():
    opts = kaldifeat.FbankOptions.from_dict({})
    opts2 = kaldifeat.FbankOptions()
    assert str(opts) == str(opts2)


def test_from_dict_partial():
    d = {'energy_floor': 10.5, 'htk_compat': True, 'mel_opts': {'num_bins':
        80, 'vtln_low': 1}, 'frame_opts': {'window_type': 'hanning'}}
    opts = kaldifeat.FbankOptions.from_dict(d)
    assert opts.energy_floor == 10.5
    assert opts.htk_compat is True
    assert opts.mel_opts.num_bins == 80
    assert opts.mel_opts.vtln_low == 1
    assert opts.frame_opts.window_type == 'hanning'
    mel_opts = kaldifeat.MelBanksOptions.from_dict(d['mel_opts'])
    assert str(opts.mel_opts) == str(mel_opts)


def test_from_dict_full_and_as_dict():
    opts = kaldifeat.FbankOptions()
    opts.htk_compat = True
    opts.mel_opts.num_bins = 80
    opts.frame_opts.samp_freq = 10
    d = opts.as_dict()
    assert d['htk_compat'] is True
    assert d['mel_opts']['num_bins'] == 80
    assert d['frame_opts']['samp_freq'] == 10
    mel_opts = kaldifeat.MelBanksOptions()
    mel_opts.num_bins = 80
    assert d['mel_opts'] == mel_opts.as_dict()
    frame_opts = kaldifeat.FrameExtractionOptions()
    frame_opts.samp_freq = 10
    assert d['frame_opts'] == frame_opts.as_dict()
    opts2 = kaldifeat.FbankOptions.from_dict(d)
    assert str(opts2) == str(opts)
    d['htk_compat'] = False
    d['device'] = torch.device('cuda', 2)
    opts3 = kaldifeat.FbankOptions.from_dict(d)
    assert opts3.htk_compat is False
    assert opts3.device == torch.device('cuda', 2)


def main():
    test_default()
    test_set_get()
    test_set_get_frame_opts()
    test_set_get_mel_opts()
    test_from_empty_dict()
    test_from_dict_partial()
    test_from_dict_full_and_as_dict()


<mask token>

<mask token>


def test_set_get():
    opts = kaldifeat.FbankOptions()
    opts.use_energy = True
    assert opts.use_energy is True
    opts.energy_floor = 1
    assert opts.energy_floor == 1
    opts.raw_energy = False
    assert opts.raw_energy is False
    opts.htk_compat = True
    assert opts.htk_compat is True
    opts.use_log_fbank = False
    assert opts.use_log_fbank is False
    opts.use_power = False
    assert opts.use_power is False
    opts.device = torch.device('cuda', 1)
    assert opts.device.type == 'cuda'
    assert opts.device.index == 1


def test_set_get_frame_opts():
    opts = kaldifeat.FbankOptions()
    opts.frame_opts.samp_freq = 44100
    assert opts.frame_opts.samp_freq == 44100
    opts.frame_opts.frame_shift_ms = 20.5
    assert opts.frame_opts.frame_shift_ms == 20.5
    opts.frame_opts.frame_length_ms = 1
    assert opts.frame_opts.frame_length_ms == 1
    opts.frame_opts.dither = 0.5
    assert opts.frame_opts.dither == 0.5
    opts.frame_opts.preemph_coeff = 0.25
    assert opts.frame_opts.preemph_coeff == 0.25
    opts.frame_opts.remove_dc_offset = False
    assert opts.frame_opts.remove_dc_offset is False
    opts.frame_opts.window_type = 'hanning'
    assert opts.frame_opts.window_type == 'hanning'
    opts.frame_opts.round_to_power_of_two = False
    assert opts.frame_opts.round_to_power_of_two is False
    opts.frame_opts.blackman_coeff = 0.25
    assert opts.frame_opts.blackman_coeff == 0.25
    opts.frame_opts.snip_edges = False
    assert opts.frame_opts.snip_edges is False


def test_set_get_mel_opts():
    opts = kaldifeat.FbankOptions()
    opts.mel_opts.num_bins = 100
    assert opts.mel_opts.num_bins == 100
    opts.mel_opts.low_freq = 22
    assert opts.mel_opts.low_freq == 22
    opts.mel_opts.high_freq = 1
    assert opts.mel_opts.high_freq == 1
    opts.mel_opts.vtln_low = 101
    assert opts.mel_opts.vtln_low == 101
    opts.mel_opts.vtln_high = -100
    assert opts.mel_opts.vtln_high == -100
    opts.mel_opts.debug_mel = True
    assert opts.mel_opts.debug_mel is True
    opts.mel_opts.htk_mode = True
    assert opts.mel_opts.htk_mode is True


def test_from_empty_dict():
    opts = kaldifeat.FbankOptions.from_dict({})
    opts2 = kaldifeat.FbankOptions()
    assert str(opts) == str(opts2)


def test_from_dict_partial():
    d = {'energy_floor': 10.5, 'htk_compat': True, 'mel_opts': {'num_bins':
        80, 'vtln_low': 1}, 'frame_opts': {'window_type': 'hanning'}}
    opts = kaldifeat.FbankOptions.from_dict(d)
    assert opts.energy_floor == 10.5
    assert opts.htk_compat is True
    assert opts.mel_opts.num_bins == 80
    assert opts.mel_opts.vtln_low == 1
    assert opts.frame_opts.window_type == 'hanning'
    mel_opts = kaldifeat.MelBanksOptions.from_dict(d['mel_opts'])
    assert str(opts.mel_opts) == str(mel_opts)


def test_from_dict_full_and_as_dict():
    opts = kaldifeat.FbankOptions()
    opts.htk_compat = True
    opts.mel_opts.num_bins = 80
    opts.frame_opts.samp_freq = 10
    d = opts.as_dict()
    assert d['htk_compat'] is True
    assert d['mel_opts']['num_bins'] == 80
    assert d['frame_opts']['samp_freq'] == 10
    mel_opts = kaldifeat.MelBanksOptions()
    mel_opts.num_bins = 80
    assert d['mel_opts'] == mel_opts.as_dict()
    frame_opts = kaldifeat.FrameExtractionOptions()
    frame_opts.samp_freq = 10
    assert d['frame_opts'] == frame_opts.as_dict()
    opts2 = kaldifeat.FbankOptions.from_dict(d)
    assert str(opts2) == str(opts)
    d['htk_compat'] = False
    d['device'] = torch.device('cuda', 2)
    opts3 = kaldifeat.FbankOptions.from_dict(d)
    assert opts3.htk_compat is False
    assert opts3.device == torch.device('cuda', 2)


def main():
    test_default()
    test_set_get()
    test_set_get_frame_opts()
    test_set_get_mel_opts()
    test_from_empty_dict()
    test_from_dict_partial()
    test_from_dict_full_and_as_dict()


<mask token>

<mask token>


def test_default():
    opts = kaldifeat.FbankOptions()
    assert opts.frame_opts.samp_freq == 16000
    assert opts.frame_opts.frame_shift_ms == 10.0
    assert opts.frame_opts.frame_length_ms == 25.0
    assert opts.frame_opts.dither == 1.0
    assert abs(opts.frame_opts.preemph_coeff - 0.97) < 1e-06
    assert opts.frame_opts.remove_dc_offset is True
    assert opts.frame_opts.window_type == 'povey'
    assert opts.frame_opts.round_to_power_of_two is True
    assert abs(opts.frame_opts.blackman_coeff - 0.42) < 1e-06
    assert opts.frame_opts.snip_edges is True
    assert opts.mel_opts.num_bins == 23
    assert opts.mel_opts.low_freq == 20
    assert opts.mel_opts.high_freq == 0
    assert opts.mel_opts.vtln_low == 100
    assert opts.mel_opts.vtln_high == -500
    assert opts.mel_opts.debug_mel is False
    assert opts.mel_opts.htk_mode is False
    assert opts.use_energy is False
    assert opts.energy_floor == 0.0
    assert opts.raw_energy is True
    assert opts.htk_compat is False
    assert opts.use_log_fbank is True
    assert opts.use_power is True
    assert opts.device.type == 'cpu'


def test_set_get():
    opts = kaldifeat.FbankOptions()
    opts.use_energy = True
    assert opts.use_energy is True
    opts.energy_floor = 1
    assert opts.energy_floor == 1
    opts.raw_energy = False
    assert opts.raw_energy is False
    opts.htk_compat = True
    assert opts.htk_compat is True
    opts.use_log_fbank = False
    assert opts.use_log_fbank is False
    opts.use_power = False
    assert opts.use_power is False
    opts.device = torch.device('cuda', 1)
    assert opts.device.type == 'cuda'
    assert opts.device.index == 1


def test_set_get_frame_opts():
    opts = kaldifeat.FbankOptions()
    opts.frame_opts.samp_freq = 44100
    assert opts.frame_opts.samp_freq == 44100
    opts.frame_opts.frame_shift_ms = 20.5
    assert opts.frame_opts.frame_shift_ms == 20.5
    opts.frame_opts.frame_length_ms = 1
    assert opts.frame_opts.frame_length_ms == 1
    opts.frame_opts.dither = 0.5
    assert opts.frame_opts.dither == 0.5
    opts.frame_opts.preemph_coeff = 0.25
    assert opts.frame_opts.preemph_coeff == 0.25
    opts.frame_opts.remove_dc_offset = False
    assert opts.frame_opts.remove_dc_offset is False
    opts.frame_opts.window_type = 'hanning'
    assert opts.frame_opts.window_type == 'hanning'
    opts.frame_opts.round_to_power_of_two = False
    assert opts.frame_opts.round_to_power_of_two is False
    opts.frame_opts.blackman_coeff = 0.25
    assert opts.frame_opts.blackman_coeff == 0.25
    opts.frame_opts.snip_edges = False
    assert opts.frame_opts.snip_edges is False


def test_set_get_mel_opts():
    opts = kaldifeat.FbankOptions()
    opts.mel_opts.num_bins = 100
    assert opts.mel_opts.num_bins == 100
    opts.mel_opts.low_freq = 22
    assert opts.mel_opts.low_freq == 22
    opts.mel_opts.high_freq = 1
    assert opts.mel_opts.high_freq == 1
    opts.mel_opts.vtln_low = 101
    assert opts.mel_opts.vtln_low == 101
    opts.mel_opts.vtln_high = -100
    assert opts.mel_opts.vtln_high == -100
    opts.mel_opts.debug_mel = True
    assert opts.mel_opts.debug_mel is True
    opts.mel_opts.htk_mode = True
    assert opts.mel_opts.htk_mode is True


def test_from_empty_dict():
    opts = kaldifeat.FbankOptions.from_dict({})
    opts2 = kaldifeat.FbankOptions()
    assert str(opts) == str(opts2)


def test_from_dict_partial():
    d = {'energy_floor': 10.5, 'htk_compat': True, 'mel_opts': {'num_bins':
        80, 'vtln_low': 1}, 'frame_opts': {'window_type': 'hanning'}}
    opts = kaldifeat.FbankOptions.from_dict(d)
    assert opts.energy_floor == 10.5
    assert opts.htk_compat is True
    assert opts.mel_opts.num_bins == 80
    assert opts.mel_opts.vtln_low == 1
    assert opts.frame_opts.window_type == 'hanning'
    mel_opts = kaldifeat.MelBanksOptions.from_dict(d['mel_opts'])
    assert str(opts.mel_opts) == str(mel_opts)


def test_from_dict_full_and_as_dict():
    opts = kaldifeat.FbankOptions()
    opts.htk_compat = True
    opts.mel_opts.num_bins = 80
    opts.frame_opts.samp_freq = 10
    d = opts.as_dict()
    assert d['htk_compat'] is True
    assert d['mel_opts']['num_bins'] == 80
    assert d['frame_opts']['samp_freq'] == 10
    mel_opts = kaldifeat.MelBanksOptions()
    mel_opts.num_bins = 80
    assert d['mel_opts'] == mel_opts.as_dict()
    frame_opts = kaldifeat.FrameExtractionOptions()
    frame_opts.samp_freq = 10
    assert d['frame_opts'] == frame_opts.as_dict()
    opts2 = kaldifeat.FbankOptions.from_dict(d)
    assert str(opts2) == str(opts)
    d['htk_compat'] = False
    d['device'] = torch.device('cuda', 2)
    opts3 = kaldifeat.FbankOptions.from_dict(d)
    assert opts3.htk_compat is False
    assert opts3.device == torch.device('cuda', 2)


def main():
    test_default()
    test_set_get()
    test_set_get_frame_opts()
    test_set_get_mel_opts()
    test_from_empty_dict()
    test_from_dict_partial()
    test_from_dict_full_and_as_dict()


<mask token>

import torch
import kaldifeat


def test_default():
    opts = kaldifeat.FbankOptions()
    assert opts.frame_opts.samp_freq == 16000
    assert opts.frame_opts.frame_shift_ms == 10.0
    assert opts.frame_opts.frame_length_ms == 25.0
    assert opts.frame_opts.dither == 1.0
    assert abs(opts.frame_opts.preemph_coeff - 0.97) < 1e-06
    assert opts.frame_opts.remove_dc_offset is True
    assert opts.frame_opts.window_type == 'povey'
    assert opts.frame_opts.round_to_power_of_two is True
    assert abs(opts.frame_opts.blackman_coeff - 0.42) < 1e-06
    assert opts.frame_opts.snip_edges is True
    assert opts.mel_opts.num_bins == 23
    assert opts.mel_opts.low_freq == 20
    assert opts.mel_opts.high_freq == 0
    assert opts.mel_opts.vtln_low == 100
    assert opts.mel_opts.vtln_high == -500
    assert opts.mel_opts.debug_mel is False
    assert opts.mel_opts.htk_mode is False
    assert opts.use_energy is False
    assert opts.energy_floor == 0.0
    assert opts.raw_energy is True
    assert opts.htk_compat is False
    assert opts.use_log_fbank is True
    assert opts.use_power is True
    assert opts.device.type == 'cpu'


def test_set_get():
    opts = kaldifeat.FbankOptions()
    opts.use_energy = True
    assert opts.use_energy is True
    opts.energy_floor = 1
    assert opts.energy_floor == 1
    opts.raw_energy = False
    assert opts.raw_energy is False
    opts.htk_compat = True
    assert opts.htk_compat is True
    opts.use_log_fbank = False
    assert opts.use_log_fbank is False
    opts.use_power = False
    assert opts.use_power is False
    opts.device = torch.device('cuda', 1)
    assert opts.device.type == 'cuda'
    assert opts.device.index == 1


def test_set_get_frame_opts():
    opts = kaldifeat.FbankOptions()
    opts.frame_opts.samp_freq = 44100
    assert opts.frame_opts.samp_freq == 44100
    opts.frame_opts.frame_shift_ms = 20.5
    assert opts.frame_opts.frame_shift_ms == 20.5
    opts.frame_opts.frame_length_ms = 1
    assert opts.frame_opts.frame_length_ms == 1
    opts.frame_opts.dither = 0.5
    assert opts.frame_opts.dither == 0.5
    opts.frame_opts.preemph_coeff = 0.25
    assert opts.frame_opts.preemph_coeff == 0.25
    opts.frame_opts.remove_dc_offset = False
    assert opts.frame_opts.remove_dc_offset is False
    opts.frame_opts.window_type = 'hanning'
    assert opts.frame_opts.window_type == 'hanning'
    opts.frame_opts.round_to_power_of_two = False
    assert opts.frame_opts.round_to_power_of_two is False
    opts.frame_opts.blackman_coeff = 0.25
    assert opts.frame_opts.blackman_coeff == 0.25
    opts.frame_opts.snip_edges = False
    assert opts.frame_opts.snip_edges is False


def test_set_get_mel_opts():
    opts = kaldifeat.FbankOptions()
    opts.mel_opts.num_bins = 100
    assert opts.mel_opts.num_bins == 100
    opts.mel_opts.low_freq = 22
    assert opts.mel_opts.low_freq == 22
    opts.mel_opts.high_freq = 1
    assert opts.mel_opts.high_freq == 1
    opts.mel_opts.vtln_low = 101
    assert opts.mel_opts.vtln_low == 101
    opts.mel_opts.vtln_high = -100
    assert opts.mel_opts.vtln_high == -100
    opts.mel_opts.debug_mel = True
    assert opts.mel_opts.debug_mel is True
    opts.mel_opts.htk_mode = True
    assert opts.mel_opts.htk_mode is True


def test_from_empty_dict():
    opts = kaldifeat.FbankOptions.from_dict({})
    opts2 = kaldifeat.FbankOptions()
    assert str(opts) == str(opts2)


def test_from_dict_partial():
    d = {'energy_floor': 10.5, 'htk_compat': True, 'mel_opts': {'num_bins':
        80, 'vtln_low': 1}, 'frame_opts': {'window_type': 'hanning'}}
    opts = kaldifeat.FbankOptions.from_dict(d)
    assert opts.energy_floor == 10.5
    assert opts.htk_compat is True
    assert opts.mel_opts.num_bins == 80
    assert opts.mel_opts.vtln_low == 1
    assert opts.frame_opts.window_type == 'hanning'
    mel_opts = kaldifeat.MelBanksOptions.from_dict(d['mel_opts'])
    assert str(opts.mel_opts) == str(mel_opts)


def test_from_dict_full_and_as_dict():
    opts = kaldifeat.FbankOptions()
    opts.htk_compat = True
    opts.mel_opts.num_bins = 80
    opts.frame_opts.samp_freq = 10
    d = opts.as_dict()
    assert d['htk_compat'] is True
    assert d['mel_opts']['num_bins'] == 80
    assert d['frame_opts']['samp_freq'] == 10
    mel_opts = kaldifeat.MelBanksOptions()
    mel_opts.num_bins = 80
    assert d['mel_opts'] == mel_opts.as_dict()
    frame_opts = kaldifeat.FrameExtractionOptions()
    frame_opts.samp_freq = 10
    assert d['frame_opts'] == frame_opts.as_dict()
    opts2 = kaldifeat.FbankOptions.from_dict(d)
    assert str(opts2) == str(opts)
    d['htk_compat'] = False
    d['device'] = torch.device('cuda', 2)
    opts3 = kaldifeat.FbankOptions.from_dict(d)
    assert opts3.htk_compat is False
    assert opts3.device == torch.device('cuda', 2)


def main():
    test_default()
    test_set_get()
    test_set_get_frame_opts()
    test_set_get_mel_opts()
    test_from_empty_dict()
    test_from_dict_partial()
    test_from_dict_full_and_as_dict()


if __name__ == '__main__':
    main()

#!/usr/bin/env python3
#
# Copyright (c)  2021  Xiaomi Corporation (authors: Fangjun Kuang)


import torch

import kaldifeat


def test_default():
    opts = kaldifeat.FbankOptions()
    assert opts.frame_opts.samp_freq == 16000
    assert opts.frame_opts.frame_shift_ms == 10.0
    assert opts.frame_opts.frame_length_ms == 25.0
    assert opts.frame_opts.dither == 1.0
    assert abs(opts.frame_opts.preemph_coeff - 0.97) < 1e-6
    assert opts.frame_opts.remove_dc_offset is True
    assert opts.frame_opts.window_type == "povey"
    assert opts.frame_opts.round_to_power_of_two is True
    assert abs(opts.frame_opts.blackman_coeff - 0.42) < 1e-6
    assert opts.frame_opts.snip_edges is True

    assert opts.mel_opts.num_bins == 23
    assert opts.mel_opts.low_freq == 20
    assert opts.mel_opts.high_freq == 0
    assert opts.mel_opts.vtln_low == 100
    assert opts.mel_opts.vtln_high == -500
    assert opts.mel_opts.debug_mel is False
    assert opts.mel_opts.htk_mode is False

    assert opts.use_energy is False
    assert opts.energy_floor == 0.0
    assert opts.raw_energy is True
    assert opts.htk_compat is False
    assert opts.use_log_fbank is True
    assert opts.use_power is True
    assert opts.device.type == "cpu"


def test_set_get():
    opts = kaldifeat.FbankOptions()
    opts.use_energy = True
    assert opts.use_energy is True

    opts.energy_floor = 1
    assert opts.energy_floor == 1

    opts.raw_energy = False
    assert opts.raw_energy is False

    opts.htk_compat = True
    assert opts.htk_compat is True

    opts.use_log_fbank = False
    assert opts.use_log_fbank is False

    opts.use_power = False
    assert opts.use_power is False

    opts.device = torch.device("cuda", 1)
    assert opts.device.type == "cuda"
    assert opts.device.index == 1


def test_set_get_frame_opts():
    opts = kaldifeat.FbankOptions()

    opts.frame_opts.samp_freq = 44100
    assert opts.frame_opts.samp_freq == 44100

    opts.frame_opts.frame_shift_ms = 20.5
    assert opts.frame_opts.frame_shift_ms == 20.5

    opts.frame_opts.frame_length_ms = 1
    assert opts.frame_opts.frame_length_ms == 1

    opts.frame_opts.dither = 0.5
    assert opts.frame_opts.dither == 0.5

    opts.frame_opts.preemph_coeff = 0.25
    assert opts.frame_opts.preemph_coeff == 0.25

    opts.frame_opts.remove_dc_offset = False
    assert opts.frame_opts.remove_dc_offset is False

    opts.frame_opts.window_type = "hanning"
    assert opts.frame_opts.window_type == "hanning"

    opts.frame_opts.round_to_power_of_two = False
    assert opts.frame_opts.round_to_power_of_two is False

    opts.frame_opts.blackman_coeff = 0.25
    assert opts.frame_opts.blackman_coeff == 0.25

    opts.frame_opts.snip_edges = False
    assert opts.frame_opts.snip_edges is False


def test_set_get_mel_opts():
    opts = kaldifeat.FbankOptions()

    opts.mel_opts.num_bins = 100
    assert opts.mel_opts.num_bins == 100

    opts.mel_opts.low_freq = 22
    assert opts.mel_opts.low_freq == 22

    opts.mel_opts.high_freq = 1
    assert opts.mel_opts.high_freq == 1

    opts.mel_opts.vtln_low = 101
    assert opts.mel_opts.vtln_low == 101

    opts.mel_opts.vtln_high = -100
    assert opts.mel_opts.vtln_high == -100

    opts.mel_opts.debug_mel = True
    assert opts.mel_opts.debug_mel is True

    opts.mel_opts.htk_mode = True
    assert opts.mel_opts.htk_mode is True


def test_from_empty_dict():
    opts = kaldifeat.FbankOptions.from_dict({})
    opts2 = kaldifeat.FbankOptions()

    assert str(opts) == str(opts2)


def test_from_dict_partial():
    d = {
        "energy_floor": 10.5,
        "htk_compat": True,
        "mel_opts": {"num_bins": 80, "vtln_low": 1},
        "frame_opts": {"window_type": "hanning"},
    }
    opts = kaldifeat.FbankOptions.from_dict(d)
    assert opts.energy_floor == 10.5
    assert opts.htk_compat is True
    assert opts.mel_opts.num_bins == 80
    assert opts.mel_opts.vtln_low == 1
    assert opts.frame_opts.window_type == "hanning"

    mel_opts = kaldifeat.MelBanksOptions.from_dict(d["mel_opts"])
    assert str(opts.mel_opts) == str(mel_opts)


def test_from_dict_full_and_as_dict():
    opts = kaldifeat.FbankOptions()
    opts.htk_compat = True
    opts.mel_opts.num_bins = 80
    opts.frame_opts.samp_freq = 10

    d = opts.as_dict()
    assert d["htk_compat"] is True
    assert d["mel_opts"]["num_bins"] == 80
    assert d["frame_opts"]["samp_freq"] == 10

    mel_opts = kaldifeat.MelBanksOptions()
    mel_opts.num_bins = 80
    assert d["mel_opts"] == mel_opts.as_dict()

    frame_opts = kaldifeat.FrameExtractionOptions()
    frame_opts.samp_freq = 10
    assert d["frame_opts"] == frame_opts.as_dict()

    opts2 = kaldifeat.FbankOptions.from_dict(d)
    assert str(opts2) == str(opts)

    d["htk_compat"] = False
    d["device"] = torch.device("cuda", 2)
    opts3 = kaldifeat.FbankOptions.from_dict(d)
    assert opts3.htk_compat is False
    assert opts3.device == torch.device("cuda", 2)


def main():
    test_default()
    test_set_get()
    test_set_get_frame_opts()
    test_set_get_mel_opts()
    test_from_empty_dict()
    test_from_dict_partial()
    test_from_dict_full_and_as_dict()


if __name__ == "__main__":
    main()
