【语音识别】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
相关推荐
胡西风_foxww1 小时前
ObsidianAI_学习一个陌生知识领域_建立学习路径和知识库框架_写一本书
人工智能·笔记·学习·知识库·obsidian·notebooklm·写一本书
Hernon1 小时前
AI智能体 - 探索与发现 Clawdbot >> Moltbot
大数据·人工智能·ai智能体·ai开发框架
输出的都是我的1 小时前
科研-工具箱汇总
人工智能
昨夜见军贴06162 小时前
IACheck AI审核功能进化新维度:重构检测报告审核技术价值链的系统路径
人工智能·重构
好奇龙猫2 小时前
【人工智能学习-AI入试相关题目练习-第十二次】
人工智能·学习
tzc_fly2 小时前
IEEE TPAMI 2026 | ConsistID:多模态高保真肖像生成
人工智能
7***n752 小时前
2026年GEO深度评测:AI时代营销新基建的实践者与分化
大数据·人工智能
愚公搬代码2 小时前
【愚公系列】《AI+直播营销》052-入局 Al 虚拟数字人直播(适合Al虚拟数字人直播的3种直播类型)
人工智能
爱吃泡芙的小白白2 小时前
神经网络压缩实战指南:让大模型“瘦身”跑得更快
人工智能·深度学习·神经网络·模型压缩