【语音识别】soundfile使用方法

1 代码解析

先看完整:

python 复制代码
from funasr import AutoModel
import numpy as np
import soundfile as sf
import torch
import librosa


def load_audio(
        path: str,
        sr: int = 16000,
        start: float = 0.0,
        duration: float | None = None,
):
    info = sf.info(path)

    start_frame = int(start * info.samplerate)
    frames = None if duration is None else int(duration * info.samplerate)

    audio, orig_sr = sf.read(
        path,
        start=start_frame,
        frames=frames,
        dtype="float32",
        always_2d=False,
    )

    if audio.ndim > 1:
        audio = np.mean(audio, axis=1)

    if orig_sr != sr:
        audio = librosa.resample(
            y=audio,
            orig_sr=orig_sr,
            target_sr=sr
        )

    return audio, sr


def main():
    model_dir = "/data/H2413325/code_dir_V2/model/Fun-ASR-Nano-2512"

    model = AutoModel(
        model=model_dir,
        trust_remote_code=True,
        remote_code="./model.py",
        device="cuda",
        disable_update=True
    )

    wav_path = "/data/H2413325/code_dir_V2/model/Fun-ASR-Nano-2512/example/zh.mp3"

    chunk_size = 0.72
    window_size = 6.0

    duration = sf.info(wav_path).duration
    timestamps = np.arange(chunk_size, duration + chunk_size, chunk_size)

    prev_text = ""

    for t in timestamps:
        start = max(0.0, t - window_size)
        end = t

        audio, _ = load_audio(
            wav_path,
            sr=16000,
            start=start,
            duration=round(end - start, 3)
        )

        result = model.inference(
            [torch.tensor(audio)],
            prev_text=prev_text,
        )

        # print(result)
        text = result[0]["text"]

        if text:
            print(text)

        prev_text = text


if __name__ == "__main__":
    main()

1.1 读取音频

代码逐句解释:

python 复制代码
# 音频分块的时间长度(单位:秒)
# 每一块音频长度为0.72秒
# 如果采样率是16KHZ,0.72秒 = 0.72 * 16000 = 11520个采样点(samples)
chunk_size = 0.72

# 获取wav音频的总时长(秒)float(单位:秒)
# 例如 如果音频是1分23秒,duration=83.0
duration = sf.info(wav_path).duration

# np.arange(start, stop, step)
# np.arange(起始值,结束值,步长)  生成一个等差数组
"""
	假设duration=3.0 		chunk_size=0.72
	那么timestamps = [
		0.72,
		1.44,
		2.16,
		2.88,
		3.60		# 注意:超过duration   因为当duration刚好不整除chunk_size时,最后一小段音频可能不会被处理,这是一种防御性写法
		]
"""
timestamps = np.arange(chunk_size, duration + chunk_size, chunk_size)

1.2 时间轴滑窗

python 复制代码
"""
按照前边的例子,t = [0.72, 1.44, 2.16, 2.88, 3.60]
"""
window_size = 6.0		# 滑动窗口
for t in timestamps:
	 # 以t为右端点,往前看6秒
	 # 例子:
	 # [0-0.72, 0-1.44 ...  0-3.6 ... 0.48-6.48 ... 4.8-10.8]
    start = max(0.0, t - window_size)
    end = t
	 
	 # 从WAV文件中,截取一小段音频,load_audio函数先不细讲,等会会在下边逐句细讲。
	 # 得到的audio,格式为np.ndarray
    audio, _ = load_audio(
        wav_path,
        sr=16000,						# 强制重采样到16KHZ
        start=start,
        duration=round(end - start, 3)
    )

1.3 load_audio函数

这个函数在干嘛?
从音频文件中,按照时间戳一段 -> 转成单声道 ->重采样 -> 返回给模型用

python 复制代码
# 函数签名
def load_audio(
        path: str,							# 音频文件路径
        sr: int = 16000,				# 目标采样率(给模型用)
        start: float = 0.0,			# 起始时间
        duration: float | None = None, 	# 读取时长,None为结尾
):	
	 # 读取音频元信息(不加载音频数据)
    info = sf.info(path)
    # 把秒转换为"采样点索引"
    # start_frame = 起始秒 * 原始采样率
    start_frame = int(start * info.samplerate)
    # 多少采样点
    frames = None if duration is None else int(duration * info.samplerate)
    # 真正读音频
    audio, orig_sr = sf.read(
        path,
        start=start_frame,		# 从第几个采样点开始读
        frames=frames,				# 共多少个采样点
        dtype="float32",			# 转换格式
        always_2d=False,			# 
    )
		
		# 转换为单声道
    if audio.ndim > 1:
        audio = np.mean(audio, axis=1)
		# 重采样
    if orig_sr != sr:
        audio = librosa.resample(
            y=audio,
            orig_sr=orig_sr,
            target_sr=sr
        )
		# 返回的audio是一个numpy.ndarray
		# 单声道,float32,一维数组
    return audio, sr
相关推荐
1941s1 分钟前
08-智能体开发实战指南(八):UI 集成与生产部署
人工智能·python·langchain
Java后端的Ai之路3 分钟前
【AI应用开发】-本地知识库答不上最新热点,我接入网络搜索,让Agent既能翻旧书也能上网冲浪
人工智能·rag·混合检索·aiagent搭建·qwen-agent
幸福在路上wellbeing3 分钟前
Android 程序员 常用的AI工具有哪些
android·人工智能
AC赳赳老秦3 分钟前
OpenClaw核心命令详解(常用指令+实战示例,高效开启自动化工作)
大数据·运维·人工智能·自动化·ai-native·deepseek·openclaw
AI科技星4 分钟前
从v=c螺旋时空公理出发的引力与电磁常数大统一
c语言·开发语言·人工智能·线性代数·算法·矩阵·数据挖掘
赋创小助手8 分钟前
NVIDIA RTX PRO 4500 Blackwell Server Edition 深度解析:AI服务器新一代“高密度算力卡”?
服务器·人工智能·科技·深度学习·计算机视觉·语言模型·自然语言处理
黎阳之光8 分钟前
黎阳之光:十五五规划下,以5G+AI全栈技术重塑零碳园区“信息高速路”
大数据·人工智能·5g·安全·智慧城市
蓝队云计算10 分钟前
部署OpenClaw选什么服务器?2核4G+10M带宽配置的蓝队云服务器轻松搞定!
运维·服务器·人工智能·云服务器·openclaw
Saniffer_SH10 分钟前
【高清视频】AI服务器调试利器:PCIe功耗分析设备 Quarch PAM 深度解析
网络·人工智能·驱动开发·嵌入式硬件·测试工具·计算机外设·压力测试
羑悻的小杀马特11 分钟前
Apache IoTDB:开启端边云协同的时序数据新时代
运维·人工智能·apache·iotdb