调研funasr时间戳返回时间坐标效果可用性

# 背景 : 分析funasr识别结果中每个中文字的时间戳偏差情况

1.评价指标:
①偏差公式:

A=标注字的时间戳(帧长区间)

B=识别字的时间戳(帧长区间)

偏差=(AB的区间并集-AB的区间交际)

偏差百分比=(AB的区间并集-AB的区间交际)/(A的帧长)

def calculate_bias(lab_section, range2):
    # 计算两个区间的交集
    start = max(lab_section[0], range2[0])
    end = min(lab_section[1], range2[1])
    if start <= end:
        intersection = end - start
    else:
        intersection = 0
    #相交部分的概率
    iou_pro=intersection/(lab_section[1] - lab_section[0])
    # 计算两个区间的偏差=两个区间的并集-两个区间的交集
    if intersection==0:
        # return "不相交返回1"
        # print("不相交返回1",)
        return 1,0
    #取两个区间的0并集
    start = min(lab_section[0], range2[0])
    end = max(lab_section[1], range2[1])
    deviation_value=((end - start)-intersection)/(lab_section[1] - lab_section[0])
    return deviation_value,iou_pro

②评估一个在大概在0.15左右,偏差在0.02没有太大影响,设定偏差阈值在30%以内可用(可以根据实际情况进行修改)

2.启动funasr引擎使用时间戳模型,建议把标点模型去掉,不要数字规整--use_itn设为0即可

3.整理fuansr识别结果

# -*- encoding: utf-8 -*-
import os
import re


def split_string(string):
    chinese_pattern=r"([\u4e00-\u9fa5])"
    chinese_text=re.sub(chinese_pattern,r"\n\1\n",string)
    english_pattern=r"([\w's]+)"
    english_text=re.sub(english_pattern,r"\1\n",chinese_text)
    english_text = re.sub(r"\n+", "\n", english_text)
    english_text = re.sub(r" |^\n+|$\n+", r"", english_text)
    return english_text

def read_txt(file):
    fr=open(file,"r",encoding="utf-8")
    contents=fr.read().strip()
    return contents.split("\t")

def read_scp(file):
    fr = open(file, "r", encoding="utf-8")
    contents = fr.readlines()
    return [i.strip().split("/")[-1].replace(".wav","") for i in contents]

def is_english(unchar):
    if (unchar >=u'\u0041' and unchar<=u'\u005a') or (unchar >=u'\u0061' and unchar<=u'\u007a'):
        return True
    else:
        return False

if __name__ == '__main__':
    result_path= "data_res"
    scp_path="data.scp"
    file_out="funasr_time.txt"

    f_w=open(file_out,"w",encoding="gbk")
    result_list=os.listdir(result_path)
    scp_list=read_scp(scp_path)
    word_time_dict={}
    for file in result_list:
        file_path=os.path.join(result_path,file)
        contents=read_txt(file_path)
        key=scp_list[int(file.split("_")[-1])]
        content=[i for i in split_string(contents[1]).split("\n") if i]
        f_w.write('"{}.mlf_fa_ph"'.format(key)+"\n")
        for id,cont in enumerate(content):
            if is_english(cont):
                pass
            else:
                f_w.write(cont+"\t"+'[{},{}]'.format(eval(contents[-1])[id][0]/1000,eval(contents[-1])[id][1]/1000) +"\n")

整理之后的格式参考

#!MLF!#
"1.mlf_fa_ph"
就	[0.49000170298543766,0.6200021547979008]
是	[0.6200021547979008,0.741044242937249]

标注的格式也是同上

然后再将识别结果和标注转为HResults统计格式,参考语音识别HResults统计工具以及字根据关键词进行合并-CSDN博客

4.根据HResults统计出识别效果,根据识别效果中的正确字以及替换字作为标注和识别字进行时间戳对比

具体代码见附件

### FunASR 时间戳信息 FunASR 是一款强大的自动语音识别 (ASR) 工具,在处理音频数据时能够提供详细的元数据支持,其中包括时间戳信息。对于 FunASR 返回时间戳格式和含义如下: #### 时间戳格式 当 FunASR 处理一段音频并返回结果时,会为每一个识别出来的单词或短语附加相应的时间戳。这些时间戳通常采用 JSON 格式的数组表示,每个元素代表一个词及其对应的起始时间和结束时间。 具体来说,JSON 结构可能类似于这样: ```json { "text": "这是测试文本。", "tokens": [ {"word":"这", "start_time":0.1, "end_time":0.3}, {"word":"是", "start_time":0.4, "end_time":0.6}, {"word":"测", "start_time":0.7, "end_time":0.9}, {"word":"试", "start_time":1.0, "end_time":1.2}, {"word":"文", "start_time":1.3, "end_time":1.5}, {"word":"本", "start_time":1.6, "end_time":1.8} ] } ``` 这里 `start_time` 和 `end_time` 的单位通常是秒,分别指示该词语在原始音频中的开始播放时刻以及结束播放时刻[^1]。 #### 含义解释 - **Start Time**: 表示当前词汇首次发音的相对位置(相对于整个音频片段),即从零点算起到这个词被说出的第一个音素所花费的时间长度。 - **End Time**: 则指代最后一个音素发声完毕后的瞬间;它标志着下一个词汇即将开始之前的一刹那。 通过这种方式,开发者可以获得更加精细粒度的信息来辅助后续的应用开发工作,比如用于字幕同步显示、关键词定位等功能实现上具有重要意义[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

空弹壳

你的鼓励是我创作的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值