3个不稳定版本

0.2.0 2021年11月8日
0.1.1 2021年9月28日
0.1.0 2021年9月28日

#534 in 音频

AGPL-3.0-only

85KB
997

irapt

IRAPT音高估计算法的实现。

API文档

提交错误报告

GitHub是项目的错误跟踪器。请在 搜索 类似的现有问题后再 提交新的问题

许可证

AGPL-3.0 许可下。


lib.rs:

irapt 是IRAPT音高估计算法的实现。

IRAPT是鲁棒音高跟踪算法(RAPT)的“瞬时”版本。

使用方法

目前,参数Irapt 是技术性的,可能难以调整,但 Parameters::default 为普通人类语音提供了一套合理的默认值,在输入可以重采样到默认的 Parameters::sample_rate 时,计算效率较高。

输入必须以 VecDeque 的形式提供给 Irapt::process,这将便于滑动分析窗口。可以通过每次调用计算由 process 从缓冲区中移除的样本数,以便跟踪估计每个音高的全局样本索引

use irapt::{Irapt, Parameters};
use std::collections::VecDeque;
use std::f64::consts::PI;

let parameters = Parameters::default();
let mut irapt = Irapt::new(parameters.clone()).expect("the default parameters should be valid");

let mut sample_buffer = (0..parameters.sample_rate as usize)
    .map(|sample_index| f64::sin(sample_index as f64 / parameters.sample_rate * 2.0 * PI * 100.0))
    .collect::<VecDeque<_>>();

let mut sample_index = 0;
while let (initial_sample_buffer_len, Some(output)) = (
    sample_buffer.len(),
    irapt.process(&mut sample_buffer),
) {
    let estimated_pitch = output.pitch_estimates().final_estimate();
    let estimated_pitch_index = (sample_index as isize + estimated_pitch.offset) as usize;
    let estimated_pitch_time = estimated_pitch_index as f64 / parameters.sample_rate;
    println!("estimated pitch at {:0.3}: {}Hz with energy {}",
             estimated_pitch_time, estimated_pitch.frequency, estimated_pitch.energy);
    sample_index += initial_sample_buffer_len - sample_buffer.len();
}

依赖关系

~3.5MB
~68K SLoC