FunASR单条/批量推理脚本

单条推理

#!/bin/bash


if [ -d "results" ]; then
    rm -rf "results"
    echo "文件夹已删除:results"
fi

if [ -e "result.txt" ]; then
    rm "result.txt"
    echo "文件已删除:result.txt"
fi


TEST_CASE="wav"

# wav
if [ "wav" = "${TEST_CASE}" ];then
    echo "=================== Test wav ========================"

    AUDIO_IN="../audio/asr_example.wav"

    # offline, 2pass, online
    time -p python3 funasr_wss_client_queue.py --host "127.0.0.1" --port 10095 \
            --mode offline \
            --thread_num 64 \
            --use_itn 0 \
            --audio_in "$AUDIO_IN" \
            --output_dir "./results" \
            --audio_fs 16000

fi



# pcm 8k 8bit alaw
if [ "pcm" = "${TEST_CASE}" ];then
    echo "=================== Test pcm ========================"

    # TODO set AUDIO_IN
    # set alaw pcm
    AUDIO_IN="..."

    time -p python3 funasr_wss_client.py --host "127.0.0.1" --port 10095 \
            --mode offline \
            --thread_num 64 \
            --use_itn 0 \
            --audio_in $AUDIO_IN \
            --output_dir "./results" \
            --audio_fs 8000

fi


if [ -d "results" ]; then
    # cat results/* > result.txt
    python3 gather_results.py
    echo "结果文件已生成:result.txt"
fi

echo "Fin."

# --host 为FunASR runtime-SDK服务部署机器ip,默认为本机ip(127.0.0.1),如果client与服务不在同一台服务器,需要改为部署机器ip
# --port 10095 部署端口号
# --mode offline表示离线文件转写
# --audio_in 需要进行转写的音频文件,支持文件路径,文件列表wav.scp
# --thread_num 设置并发发送线程数,默认为1
# --ssl 设置是否开启ssl证书校验,默认1开启,设置为0关闭

批量推理

# 批量转写,分条结果保存到"multi_results/源文件夹名"中,音频与"音频名.txt"相对应
# 生成的result.txt和result文件夹是临时中转的,最终移到目的路径
#!/bin/bash

# 创建或确保 results 目录存在
mkdir -p "results"

# 设置测试用例为 wav
TEST_CASE="wav"

# 处理 ../audio/aac1 中的所有音频文件
AUDIO_DIR="../audio/acc1"
AUDIO_SUBDIR=$(basename "$AUDIO_DIR")  # 获取 AUDIO_DIR 的最后一层目录名称
AUDIO_RESULTS_DIR="multi_results/$AUDIO_SUBDIR"  # 结果文件夹路径
mkdir -p "$AUDIO_RESULTS_DIR"  # 创建子目录

for AUDIO_FILE in "$AUDIO_DIR"/*.wav; do
# 删除旧的 results 目录和 result.txt 文件

    if [ -d "results" ]; then
        rm -rf "results"
        echo "文件夹已删除:results"
    fi

    if [ -e "result.txt" ]; then
        rm "result.txt"
        echo "文件已删除:result.txt"
    fi

    if [ -f "$AUDIO_FILE" ]; then
        echo "=================== Processing $AUDIO_FILE ========================"
     
        # CPU/GPU开关
        # export CUDA_VISIBLE_DEVICES=0

        # 使用 funasr_wss_client_queue.py 进行语音识别
        time -p python3 funasr_wss_client_queue.py --host "127.0.0.1" --port 10095 \
                --mode offline \
                --thread_num 64 \
                --use_itn 0 \
                --audio_in "$AUDIO_FILE" \
                --output_dir "./results" \
                --audio_fs 16000 
                
        if [ -d "results" ]; then
            # cat results/* > result.txt
            python3 gather_results.py
            echo "结果文件已生成:result.txt"
        fi

        # 获取文件名(不带路径和扩展名)
        FILENAME=$(basename "$AUDIO_FILE" .wav)

        # 检查识别结果文件是否存在
        if [ -f "result.txt" ]; then
            # 将 result.txt 复制到 AUDIO_RESULTS_DIR 并重命名为 音频名.txt
            cp "result.txt" "$AUDIO_RESULTS_DIR/$FILENAME.txt"
            echo "识别结果已保存至:$AUDIO_RESULTS_DIR/$FILENAME.txt"
        else
            echo "警告:未找到识别结果文件:result.txt"
            echo "检查 funasr_wss_client_queue.py 的输出,确保文件被正确生成。"
        fi
    fi
done

echo "所有结果文件已生成并保存至:$AUDIO_RESULTS_DIR/"
echo "Fin."

<think>好的,我现在要解决用户在使用funasr库的fsmn_vad_streaming时遇到的TypeError问题,具体是torch.cat函数在处理numpy.float32类型数据时无法转换为Tensor的转换错误。首先,我需要理解这个错误的原因以及如何解决它。 首先,用户提到的错误涉及到torch.cat函数,这个函数是用来拼接张量的,所以输入必须是PyTorch的Tensor类型。而问题出在有一个numpy.float32类型的数据被传入,导致类型不匹配。因此,需要检查代码中哪里产生了numpy数组,并确保在拼接之前将其转换为Tensor。 接下来,我需要回忆PyTorch和NumPy之间的数据转换。通常,使用torch.from_numpy()可以将NumPy数组转换为Tensor。反之,使用.numpy()方法将Tensor转回NumPy。所以,用户的问题可能是在某个步骤中,数据以NumPy数组的形式存在,而没有被正确转换。 然后,用户提供的代码示例是使用funasr的AutoModel加载模型并进行推理。可能是在数据处理或模型返回的结果中存在NumPy数组。例如,模型可能在某些情况下返回NumPy类型的数据,而后续处理却直接使用这些数据而没有转换。 现在,我需要思考可能的解决步骤。首先,检查数据流中哪些地方可能产生NumPy数组。例如,在音频加载时,是否使用了librosa等库,这些库默认返回NumPy数组。如果是这样,需要在使用前将数据转换为Tensor。 另一个可能性是模型输出的某些部分返回了NumPy数组。这时候需要在拼接之前,将每个部分显式转换为Tensor。例如,在调用torch.cat之前,使用列表推导式或循环将每个元素转换为Tensor。 此外,还需要查看funasr库的文档或源代码,确认fsmn_vad_streaming模块的数据处理流程。可能存在某些配置选项或参数需要设置,以确保输出为Tensor类型。如果库的某些函数默认返回NumPy数组,可能需要调整参数或调用方式。 然后,用户提到使用的是model.generate方法,可能这个方法返回的结果中某些字段是NumPy数组。因此,在将结果传递给后续处理步骤时,需要显式转换这些数组为Tensor。 可能的解决步骤包括: 1. 在数据加载阶段,确保输入数据已经是Tensor类型。例如,使用torchaudio加载音频文件,或者在使用librosa加载后立即转换为Tensor。 2. 检查模型生成的结果中的各个部分,查看是否有NumPy数组存在。例如,打印res的类型,或者检查返回值的结构。 3. 在调用torch.cat之前,将所有参与拼接的变量转换为Tensor。例如,使用列表推导式,将每个元素用torch.from_numpy()转换。 例如,假设res中的某个部分是NumPy数组,可以这样做: tensors = [torch.from_numpy(arr) if isinstance(arr, np.ndarray) else arr for arr in res] result = torch.cat(tensors, dim=0) 这样可以确保所有元素都是Tensor类型。 另外,还需要注意数据类型的兼容性。例如,NumPy数组可能是float32,而PyTorch期望的是float32或其他类型。需要确保转换后的Tensor类型正确。 如果用户提供的代码中有自定义的处理步骤,例如在生成结果后进行了额外的处理,那么也需要检查这些步骤中是否有数据转换的问题。 此外,检查funasr库的版本是否最新,或者是否存在已知的此类问题。用户提到使用的是model_revision="v2.0.4",可能需要查看该版本的文档或更新到最新版本,看是否已经修复了这个问题。 如果以上方法都无法解决问题,可能需要查看完整的错误堆栈,确定具体是哪一行代码触发了错误,从而更精确地定位问题所在。例如,错误可能发生在模型内部的一个步骤,这时候可能需要修改模型代码或联系库的维护者。 总结起来,解决步骤可能包括: - 确保输入数据是Tensor类型 - 检查模型输出中的数据类型 - 显式转换NumPy数组到Tensor - 检查库的版本和文档 - 查看完整的错误堆栈以定位问题 在帮助用户时,需要逐步引导他们检查这些可能的原因,并提供具体的代码修改建议。同时,提醒他们在处理数据时注意类型的一致性,避免混合使用NumPy和PyTorch数据类型。</think>关于`funasr`库中`fsmn_vad_streaming`模块因`torch.cat`函数引发的类型错误(`numpy.float32`无法转换为`Tensor`),以下是逐步分析和解决方案: --- ### **问题分析** 1. **错误根源** `torch.cat`要求所有输入为PyTorch的`Tensor`类型,但实际传入的数据可能包含`numpy.ndarray`(如`numpy.float32`)。这通常发生在数据预处理或模型输出的中间结果未正确转换为`Tensor`时。 2. **常见场景** - 使用音频加载库(如`librosa`)返回NumPy数组,未手动转换为`Tensor`[^1]。 - 模型输出的中间结果包含NumPy数组,未在后续处理中显式转换。 --- ### **解决方案** #### **1. 显式转换数据类型** 在调用`torch.cat`前,确保所有输入均为`Tensor`。若数据源为NumPy数组,使用`torch.from_numpy()`转换: ```python import torch import numpy as np # 示例:假设存在NumPy数组 numpy_data = np.array([1.0, 2.0], dtype=np.float32) tensor_data = torch.from_numpy(numpy_data) # 转换为Tensor # 拼接前统一类型 result = torch.cat([tensor_data, other_tensor], dim=0) ``` #### **2. 检查数据预处理流程** - **音频加载**:若使用`librosa`或类似库加载音频,需手动转换为`Tensor`: ```python import librosa import torch waveform, sr = librosa.load("audio.wav", sr=16000) waveform_tensor = torch.from_numpy(waveform).float() # 转换为float32 Tensor ``` - **模型输入**:确保输入模型的已经是`Tensor`格式,而非NumPy数组。 #### **3. 检查模型输出** 若模型返回结果中包含NumPy数组,需遍历并转换: ```python res = model.generate(input=wav_file) # 转换所有NumPy数组为Tensor processed_res = [ torch.from_numpy(item) if isinstance(item, np.ndarray) else item for item in res ] # 执行拼接操作 final_output = torch.cat(processed_res, dim=0) ``` #### **4. 验证库版本与文档** - 确保`funasr`版本支持`Tensor`输出(如`model_revision="v2.0.4"`可能存在差异)。 - 参考官方文档或GitHub Issues,确认是否已知此问题及修复方案。 --- ### **代码示例修正** 针对引用[1]中的代码,添加显式类型转换: ```python from funasr import AutoModel import torch import numpy as np model = AutoModel(model="fsmn-vad", model_revision="v2.0.4") wav_file = "/user/your_wav_path/example.wav" res = model.generate(input=wav_file) # 转换所有NumPy数组到Tensor tensor_res = [torch.from_numpy(x) if isinstance(x, np.ndarray) else x for x in res] # 执行拼接操作(假设需要拼接) if tensor_res: concatenated = torch.cat(tensor_res, dim=0) print(concatenated) ``` --- ### **相关问题** 1. 如何检查PyTorch Tensor和NumPy数组的类型兼容性? 2. 在`funasr`中如何处理多段音频的流式输入? 3. PyTorch与NumPy混合编程时需要注意哪些数据类型陷阱? : 引用示例中的代码来自`funasr`官方文档或示例实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之群害马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值