#语音 #编解码器 #编码

codec2

Codec2低比特率语音压缩编解码器的纯Rust实现

3个版本 (重大变更)

0.3.0 2023年2月18日
0.2.0 2020年12月1日
0.1.0 2020年11月30日

音频类别中排名#400

每月下载量31

LGPL-2.1-only AND MIT

285KB
4.5K SLoC

Codec2

将以下内容添加到您的Cargo.toml

[dependencies]
codec2 = "0.3"

使用方法

目前实现了3200、2400、1600、1400、1300和1200比特率的编码和解码。

创建一个Codec2对象,例如Codec2::new(Codec2Mode::MODE_3200),然后反复获取原始8kHz 16位音频样本,并调用encodesamples_per_frame()样本编码成bits_per_frame()压缩比特。在接收端,创建一个Codec2对象,并反复调用decode来解压缩接收到的每个字节块为下一个样本。

以下是一个完整的示例。此示例使用zerocopy将&[i16]切片解释为&[u8]进行I/O。

Cargo.toml

[dependencies]
zerocopy = "0.3.0"
codec2 = "0"

main.rs

use codec2::*;
use std::env::args;
use std::io::prelude::*;
use zerocopy::AsBytes;

fn main() -> std::io::Result<()> {
    if args().len() != 4 || (args().nth(1).unwrap() != "enc" && args().nth(1).unwrap() != "dec") {
        eprintln!("Usage: {} (enc|dec) inputfile outputfilename", args().nth(0).unwrap());
        eprintln!("Files should be raw 16-bit signed 8khz audio");
        return Ok(());
    }
    let mut fin = std::fs::File::open(args().nth(2).unwrap())?;
    let mut fout = std::fs::File::create(args().nth(3).unwrap())?;
    let mut c2 = Codec2::new(Codec2Mode::MODE_3200);
    let mut samps = vec![0; c2.samples_per_frame()]; //i16 I/O buffer
    let mut packed = vec![0; (c2.bits_per_frame() + 7) / 8]; //u8 I/O buffer for encoded bits
    if args().nth(1).unwrap() == "enc" {
        while fin.read_exact(samps.as_bytes_mut()).is_ok() {
            c2.encode(&mut packed, &samps[..]);
            fout.write_all(&packed)?;
        }
    } else {
        while fin.read_exact(&mut packed).is_ok() {
            c2.decode(&mut samps[..], &packed);
            fout.write_all(samps.as_bytes())?;
        }
    }
    Ok(())
}

无运行时依赖项