Skip to content

LX588387/auris

Repository files navigation

auris

给大语言模型装上耳朵 —— 把音频编码器 / 离散音频 token 接入 LLM,做音频理解、描述、问答与检索。

CI codeql Python License: MIT code style: black

auris 是一个结构清晰、可复现的音频语言模型(Audio-LM)框架。它把 「音频怎么进 LLM」这件事拆成三段可替换的组件:

音频 ──▶ 编码器 Encoder ──▶ 投影器 Projector ──▶ 语言模型后端 LLMBackend ──▶ 文本
        (连续嵌入 / 离散 token)   (对齐到词嵌入空间)     (拼接 prompt 后生成)

在此之上提供四类开箱即用的任务:音频理解(分类)音频描述 (captioning)音频问答(QA)音频-文本检索(retrieval)

框架核心只依赖 numpypyyaml,无需 GPU 即可跑通整条链路和全部单测; 真实的 Whisper / BEATs / CLAP 编码器与 HuggingFace LLM 通过统一协议以可选 依赖(auris[torch])接入。

为什么再写一个?

调研了 SLAM-LLM、multi_token、CLAP 等一批实现后,我总结出几个共性痛点, auris 针对性地做了改进:

痛点 auris 的做法
编码器 / 投影器散落各处,扩展困难 统一的注册表@register_encoder 等),一行接入新组件
核心逻辑与重依赖耦合,测试要下模型、要 GPU 核心纯 numpy,零下载确定性单测,torch 仅可选
检索缺现成 top-k 索引与 recall@k 评测 内置 RetrievalIndex + recall@k / mAP
描述指标依赖 Java(METEOR/SPICE) 纯 Python 的 BLEU / ROUGE-L / CIDEr

安装

pip install auris                # 核心(numpy + pyyaml)
pip install "auris[torch]"       # 接入真实 LLM / 训练投影器
pip install "auris[audio]"       # 读取 wav 以外的音频格式

从源码:

git clone https://github.com/LX588387/auris.git
cd auris
pip install -e ".[dev]"

快速上手

from auris import AudioLM, LogMelEncoder, load_audio

clip = load_audio("dog_bark.wav", target_sr=16000)
lm = AudioLM(LogMelEncoder())          # 默认用零依赖的 Echo 后端演示链路

lm.caption(clip)                        # 音频描述
lm.answer(clip, "这是什么动物的叫声?")   # 音频问答
lm.understand(clip, ["狗", "猫", "鸟"])   # 零样本分类

说明:默认的 EchoBackend确定性占位后端,只用于把链路跑通和写 可复现单测,不会产生有意义的自然语言。要得到真实的描述 / 回答,请换成 HuggingFace 后端:

from auris.integrations.hf_backend import HFCausalLMBackend
lm = AudioLM(LogMelEncoder(), backend=HFCausalLMBackend.from_pretrained("Qwen/Qwen2-0.5B"))

音频-文本检索

from auris import AudioTextRetriever, LogMelEncoder

retr = AudioTextRetriever(LogMelEncoder(), shared_dim=256)
index = retr.build_text_index({"c1": "钢琴独奏", "c2": "犬吠", "c3": "雨声"})
hits = retr.audio_to_text(clip, index, k=3)      # 以音搜文

接入离散音频 token(来自 soniq 这类编解码器)

from auris import AudioLM, DiscreteTokenEncoder, CodebookSpec

spec = CodebookSpec(num_codebooks=8, codebook_size=1024)
lm = AudioLM(DiscreteTokenEncoder(spec, output_dim=256))
lm.caption(rvq_tokens)                            # rvq_tokens: (码本, 时间) 的整数网格

命令行

auris info                                        # 版本与已注册组件
auris caption clip.wav
auris qa clip.wav "背景里有几个人在说话?"
auris classify clip.wav 语音 音乐 环境声

文档

许可

MIT © Dai Yanan

About

音频语言模型框架:把音频编码器 / 离散音频 token 接入 LLM,实现音频理解、描述、问答与检索(纯 numpy 核心,可选 torch)

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages