当前位置: 首页 > news >正文

pyannote源码阅读(一)

pyannote源码阅读(一)

  • 前言
  • pyannote-core源码
    • Segment类的设计和实现要点
      • dataclass装饰器
      • 迭代器方法
      • 提供的方法
      • 字符串和图形表示
  • 小结

前言

读一读代码,顺便记录一下笔记。

pyannote-core源码

Segment类的设计和实现要点

from dataclasses import dataclass@dataclass(frozen=True, order=True)
class Segment:start: float = 0.0end: float = 0.0def set_precision(ndigits: Optional[int] = None):global AUTO_ROUND_TIMEglobal SEGMENT_PRECISIONdef __post_init__(self):if AUDIO_ROUND_TIME:object.__setattr__(self, 'start', int(self.start / SEGMENT_PRECISION + 0.5) * SEGMENT_PRECISION)object.__setattr__(self, 'end', int(self.end / SEGMENT_PRECISION + 0.5) * SEGMENT_PRECISION)@propertyduration(self) -> float:return self.end - self.start if self else 0.

dataclass装饰器

dataclass是从Python3.7版本开始,作为标准库中的模块被引入。
可以简化数据类的设计,在上面的代码中,直接定义属性并初始化。

  start: float = 0.0end: float = 0.0

frozen=True 创建不可变类,不允许更改属性值。

创建一个Segment对象,可以这样Segment(start=1, end=5) 或者 Segment(1, 5)

这里有一个细节,如果设置了数值经度,比如保留2位小数,但初始化时使用了三位以上的小数,要如何处理?因为使用了frozen,是无法对属性进行直接修改的。

方法是在__post_init__方法中使用如下代码:

object.__setattr__(self, 'start', int(self.start / SEGMENT_PRECISION + 0.5) * SEGMENT_PRECISION)

顾名思义,__post_init__方法在对象初始化之后调用。

  • 全局变量
    AUTO_ROUND_TIME 是否四舍五入
    SEGMENT_PRECISION 精度

迭代器方法


def __iter__(self): -> Iterator[float]:yield self.startyield self.end

通过yield实现,从而支持

segment = Segment(start, end)
start, end = segment

提供的方法

  • copy 复制一个Segment
  • contains 判读一个Segment是否包含另一个Segment
  • and 求两个Segment的交集
  • or 求两个Segment的并集
  • intersects 判断连个Segment是否相交
  • overlaps 判断一个Segment是否覆盖另一个

字符串和图形表示

def __str__(self):if self:return '[%s --> %s]' % (self._str_helper(self.start), self._str_helper(self.end))

可以把Segment(1337, 1337 + 0.42)表示为:[ 00:22:17.000 --> 00:22:17.420],very nice。

小结

这是一个非常不错的设计,在音频处理的很多场景都可以参考。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 英国政府停止使用人工智能
  • Linux 命令重定向介绍
  • electron 两个渲染进程之间通信
  • 教育行业,等保之重
  • 2534. 乘方 [CSP-J 2022]
  • WIN/MAC 图像处理软件Adobe Photoshop PS2024软件下载安装
  • Android开发语言Kotlin简介
  • 硬件寄存器的简单理解
  • http重要的状态码【精简版】
  • 前端理论总结(js)——原型链 // 原型 // 浅拷贝和深拷贝
  • 爬取央视热榜并存储到MongoDB
  • 前端宝典十六:深入浅出8大设计模式
  • WIFI驱动开发
  • go中的并发处理
  • LEAP模型在能源环境发展、碳排放建模预测及分析中实践应用
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • hadoop集群管理系统搭建规划说明
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JAVA_NIO系列——Channel和Buffer详解
  • Java程序员幽默爆笑锦集
  • MySQL用户中的%到底包不包括localhost?
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spring Cloud Feign的两种使用姿势
  • Vue 2.3、2.4 知识点小结
  • Zsh 开发指南(第十四篇 文件读写)
  • 分布式熔断降级平台aegis
  • 聚簇索引和非聚簇索引
  • 力扣(LeetCode)22
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • No resource identifier found for attribute,RxJava之zip操作符
  • 1.Ext JS 建立web开发工程
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​iOS安全加固方法及实现
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #宝哥教你#查看jquery绑定的事件函数
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (007)XHTML文档之标题——h1~h6
  • (1)Hilt的基本概念和使用
  • (175)FPGA门控时钟技术
  • (20)docke容器
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (java)关于Thread的挂起和恢复
  • (二)构建dubbo分布式平台-平台功能导图
  • (万字长文)Spring的核心知识尽揽其中
  • (一)基于IDEA的JAVA基础10
  • (转)3D模板阴影原理
  • (转)可以带来幸福的一本书
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET Standard 的管理策略
  • .NET导入Excel数据
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)