Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

md 和 src 句子太长,能否自动断句 #11

Open
chenxinfeng4 opened this issue Nov 9, 2022 · 18 comments
Open

md 和 src 句子太长,能否自动断句 #11

chenxinfeng4 opened this issue Nov 9, 2022 · 18 comments

Comments

@chenxinfeng4
Copy link

转录某个视频生成.srt和.md结果识别差不多是正确的。但我中间停顿比较少,使得字幕连成一片。能否有好的预处理方法,能合适的断句。

00:01:23,000 --> 00:01:51,000
好了,这就是我们创建出来的数据,还有包括它的一条预置线。然后我们拖动这个预置线的时候,就可以看到它对应的数据的位置就发生了,当我们拖动它的时候,就可以看到它的预置的位置,它就给你实时的显示出来了。

7
00:01:51,000 --> 00:02:12,000
好,这个我们怎样去查看这条具体的,在代码中获得具体的这个预置呢?然后我们可以看到我们创建的这个数据邮标对,数据预置对象呢,是叫DRAG9,然后我们也给一个show这样一个方法,就可以是表示它是实时的在图像中显示。

@chenxinfeng4
Copy link
Author

突然发现视频 cut 之后,字幕文件没有 cut

@endcloud
Copy link

endcloud commented Nov 9, 2022

简单的方式可以用标点符号断, 设一个阈值, duration用字数比例做系数就行了, 我之前做项目尝试过, 对中文来说效果还行. vad是有这种小缺陷.

@chenxinfeng4
Copy link
Author

简单的方式可以用标点符号断, 设一个阈值, duration用字数比例做系数就行了, 我之前做项目尝试过, 对中文来说效果还行. vad是有这种小缺陷.

CV 的工具我好能懂一些,语音识别的工具箱我是完全不懂。通过设定阈值,应该是可行,但找不到设定参数的代码位置。

如果辛辛苦苦矫正的 src 文件没法被 cut 同步,后期还得再来一次字幕生成&矫正,也费时。

@mli
Copy link
Owner

mli commented Nov 9, 2022

简单的方式可以用标点符号断, 设一个阈值, duration用字数比例做系数就行了, 我之前做项目尝试过, 对中文来说效果还行. vad是有这种小缺陷.

有兴趣的话欢迎PR这个feature

@mli
Copy link
Owner

mli commented Nov 9, 2022

@chenxinfeng4 你可以试试 --whisper-model medium 甚至 large 不同的模型有不同的长度偏好

@chenxinfeng4
Copy link
Author

@chenxinfeng4 你可以试试 --whisper-model medium 甚至 large 不同的模型有不同的长度偏好

我之前展示的是medium的结果,我又试了 large 模型——断句更短,效果很好多。但对于“视频”字幕来说,还是稍微有点长。可能是这些模型并没有专门为了配字幕而fineture吧。

18
00:01:22,760 --> 00:01:34,760
这就是我们创建出来的数据,还有包括它的一条预支线

19
00:01:34,760 --> 00:01:51,760
当我们拖动预支线的时候,就可以看到它对应的数据的位置

20
00:01:51,760 --> 00:01:57,760
我们怎样去查看这条在代码中获得的具体的预支呢?

21
00:01:57,760 --> 00:02:04,760
我们可以看到我们创建的数据预支对象叫drugline

22
00:02:04,760 --> 00:02:11,760
跟一个show这样的方法就可以表示它是实时的在图像中显示

@mli
Copy link
Owner

mli commented Nov 9, 2022

一个办法是先按照标点split,这样前两句就可以变短。

后面的话可以先切词,然后按均匀长度分开就是。例如

import jieba

list(jieba.cut('我们怎样去查看这条在代码中获得的具体的预支呢?'))

输出

['我们',
 '怎样',
 '去',
 '查看',
 '这条',
 '在',
 '代码',
 '中',
 '获得',
 '的',
 '具体',
 '的',
 '预支',
 '呢',
 '?']

@chenxinfeng4
Copy link
Author

autocut 的识别精度和呈现效果已经不错,对我来说是一个“惊喜”。瑕疵是有的,离专业的字幕调试有很长的路。但对于我们既做AI,又愿意剪片子的人来说,autocut 是一个很有趣有用的方面,也让我去畅享未来AI的应用。

或许 autocut 的后继者能像“copilot” 跨界,引导视频创作产业吧。

代码很优雅,向您看齐。Issue closed。

@endcloud
Copy link

简单的方式可以用标点符号断, 设一个阈值, duration用字数比例做系数就行了, 我之前做项目尝试过, 对中文来说效果还行. vad是有这种小缺陷.

CV 的工具我好能懂一些,语音识别的工具箱我是完全不懂。通过设定阈值,应该是可行,但找不到设定参数的代码位置。

如果辛辛苦苦矫正的 src 文件没法被 cut 同步,后期还得再来一次字幕生成&矫正,也费时。

  • 不好意思, 我没表达清楚让您误会了, 我的意思是在生成srt文件前的逻辑上加一步预处理, 用一个限制大小的滑动窗口简单处理一下. 模型本身似乎没有特定对中文长度的参数.
  • P.S. 我其实是做业务开发的, AI相关其实一般只能看得懂API :) 只是早前用paddlepaddle的时候恰巧学习了一点语音模型的知识, 不过我体验下来whisper已经比paddle-speech强太多了, paddle-speech是需要手动做vad的, 输入文件稍微大一点了甚至直接无法工作.
  • 我已经将这部分逻辑提交了pr, 等李老师审核过后您可以再尝试一下.

@chenqianhe
Copy link
Collaborator

简单的方式可以用标点符号断, 设一个阈值, duration用字数比例做系数就行了, 我之前做项目尝试过, 对中文来说效果还行. vad是有这种小缺陷.

CV 的工具我好能懂一些,语音识别的工具箱我是完全不懂。通过设定阈值,应该是可行,但找不到设定参数的代码位置。
如果辛辛苦苦矫正的 src 文件没法被 cut 同步,后期还得再来一次字幕生成&矫正,也费时。

  • 不好意思, 我没表达清楚让您误会了, 我的意思是在生成srt文件前的逻辑上加一步预处理, 用一个限制大小的滑动窗口简单处理一下. 模型本身似乎没有特定对中文长度的参数.
  • P.S. 我其实是做业务开发的, AI相关其实一般只能看得懂API :) 只是早前用paddlepaddle的时候恰巧学习了一点语音模型的知识, 不过我体验下来whisper已经比paddle-speech强太多了, paddle-speech是需要手动做vad的, 输入文件稍微大一点了甚至直接无法工作.
  • 我已经将这部分逻辑提交了pr, 等李老师审核过后您可以再尝试一下.

试试这个库?
https://github.com/dongrixinyu/JioNLP/wiki/Gadget-%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3#%E6%96%87%E6%9C%AC%E5%88%86%E5%8F%A5
这里应该得考虑处理各种标点,只有书名号以及书名号中的标点、间隔号、连接号、具有特殊含义的词语的引号可以出现在字幕中;所以不应该暴力直接分割,得考虑一下书名号

分句之后音频时间的划分是不是可以 可以在先按字数比例确定大概时间点后;在考虑这个时间点前后一段时间,在整个这一段中找到波谷当做划分点是不是能再减小误差呢?

虽然说15字是一般的字幕字数上限;但是其实每句划分该是要根据内容来不太应该随便断开;我目前想法是分词后对应时间的时候也考虑音频的波峰波谷,文本跟音频的波峰基本能一一对应,这样来找对应划分时间点应该更准确一点。

以及这个issue是不是可以再打开,大家一起看看这个问题有没有更优的做法呢?

@mli mli reopened this Nov 10, 2022
@chenqianhe
Copy link
Collaborator

简单的方式可以用标点符号断, 设一个阈值, duration用字数比例做系数就行了, 我之前做项目尝试过, 对中文来说效果还行. vad是有这种小缺陷.

CV 的工具我好能懂一些,语音识别的工具箱我是完全不懂。通过设定阈值,应该是可行,但找不到设定参数的代码位置。

如果辛辛苦苦矫正的 src 文件没法被 cut 同步,后期还得再来一次字幕生成&矫正,也费时。

发现确实有这个问题,如果修改md文件的话只会依赖md剪切,srt没动,还得再手动处理;我刚搞了srt转md,等下把srt剪切也顺便搞下,不然确实难受了

@chenqianhe
Copy link
Collaborator

简单的方式可以用标点符号断, 设一个阈值, duration用字数比例做系数就行了, 我之前做项目尝试过, 对中文来说效果还行. vad是有这种小缺陷.

CV 的工具我好能懂一些,语音识别的工具箱我是完全不懂。通过设定阈值,应该是可行,但找不到设定参数的代码位置。
如果辛辛苦苦矫正的 src 文件没法被 cut 同步,后期还得再来一次字幕生成&矫正,也费时。

发现确实有这个问题,如果修改md文件的话只会依赖md剪切,srt没动,还得再手动处理;我刚搞了srt转md,等下把srt剪切也顺便搞下,不然确实难受了

#18

剪辑后会生成新的srt

@mli
Copy link
Owner

mli commented Nov 10, 2022

简单的方式可以用标点符号断, 设一个阈值, duration用字数比例做系数就行了, 我之前做项目尝试过, 对中文来说效果还行. vad是有这种小缺陷.

CV 的工具我好能懂一些,语音识别的工具箱我是完全不懂。通过设定阈值,应该是可行,但找不到设定参数的代码位置。
如果辛辛苦苦矫正的 src 文件没法被 cut 同步,后期还得再来一次字幕生成&矫正,也费时。

发现确实有这个问题,如果修改md文件的话只会依赖md剪切,srt没动,还得再手动处理;我刚搞了srt转md,等下把srt剪切也顺便搞下,不然确实难受了

这个挺好的。本来我也是想实现这个。就是在最终的字幕生成上,可以先转成 md 编译,然后再转回去

@chenqianhe
Copy link
Collaborator

简单的方式可以用标点符号断, 设一个阈值, duration用字数比例做系数就行了, 我之前做项目尝试过, 对中文来说效果还行. vad是有这种小缺陷.

CV 的工具我好能懂一些,语音识别的工具箱我是完全不懂。通过设定阈值,应该是可行,但找不到设定参数的代码位置。
如果辛辛苦苦矫正的 src 文件没法被 cut 同步,后期还得再来一次字幕生成&矫正,也费时。

发现确实有这个问题,如果修改md文件的话只会依赖md剪切,srt没动,还得再手动处理;我刚搞了srt转md,等下把srt剪切也顺便搞下,不然确实难受了

这个挺好的。本来我也是想实现这个。就是在最终的字幕生成上,可以先转成 md 编译,然后再转回去

md和srt各有优势吧。md编辑内容会好搞点,但是调整对应的时间在srt上好做一些,借助Arctime软件啥的很好调整。支持单个调整,整体偏移等等。
https://arctime.org/

@mli
Copy link
Owner

mli commented Nov 11, 2022

https://arctime.org/

听过说这个,没用过。他的字幕生成好像是收费的吧?几年前用过剪映,能免费生成字幕,但对长视频编辑比较吃力一点。

@chenqianhe
Copy link
Collaborator

chenqianhe commented Nov 11, 2022 via email

@mli
Copy link
Owner

mli commented Nov 11, 2022

之后有时间的话可以做一个文档,讲下常见录屏、录像,和用编译软件做最后的一些精调。方便没有太多视频编辑经验的同学。

@endcloud
Copy link

简单的方式可以用标点符号断, 设一个阈值, duration用字数比例做系数就行了, 我之前做项目尝试过, 对中文来说效果还行. vad是有这种小缺陷.

CV 的工具我好能懂一些,语音识别的工具箱我是完全不懂。通过设定阈值,应该是可行,但找不到设定参数的代码位置。
如果辛辛苦苦矫正的 src 文件没法被 cut 同步,后期还得再来一次字幕生成&矫正,也费时。

  • 不好意思, 我没表达清楚让您误会了, 我的意思是在生成srt文件前的逻辑上加一步预处理, 用一个限制大小的滑动窗口简单处理一下. 模型本身似乎没有特定对中文长度的参数.
  • P.S. 我其实是做业务开发的, AI相关其实一般只能看得懂API :) 只是早前用paddlepaddle的时候恰巧学习了一点语音模型的知识, 不过我体验下来whisper已经比paddle-speech强太多了, paddle-speech是需要手动做vad的, 输入文件稍微大一点了甚至直接无法工作.
  • 我已经将这部分逻辑提交了pr, 等李老师审核过后您可以再尝试一下.

试试这个库? https://github.com/dongrixinyu/JioNLP/wiki/Gadget-%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3#%E6%96%87%E6%9C%AC%E5%88%86%E5%8F%A5 这里应该得考虑处理各种标点,只有书名号以及书名号中的标点、间隔号、连接号、具有特殊含义的词语的引号可以出现在字幕中;所以不应该暴力直接分割,得考虑一下书名号

分句之后音频时间的划分是不是可以 可以在先按字数比例确定大概时间点后;在考虑这个时间点前后一段时间,在整个这一段中找到波谷当做划分点是不是能再减小误差呢?

虽然说15字是一般的字幕字数上限;但是其实每句划分该是要根据内容来不太应该随便断开;我目前想法是分词后对应时间的时候也考虑音频的波峰波谷,文本跟音频的波峰基本能一一对应,这样来找对应划分时间点应该更准确一点。

以及这个issue是不是可以再打开,大家一起看看这个问题有没有更优的做法呢?

  • 感谢指点, 已经结合做了改进, AI相关实属门外汉.
  • 关于"波峰波谷", VAD本身也利用到了这个来做切割, 再细微的变化捕捉恐怕不容易, 尤其whisper用的silero-vad已经是较为优秀的实现
  • 后续我先进一步做分词(长单句)的优化

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants