|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 / u- I2 }% @: r, l& n' L
: Y, O2 d( n' F* I$ t. w3 m0 w借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。4 `; I2 ?7 M4 b2 F& c9 L
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。* Q8 ~1 }0 l& [3 k& }
----------------------------------------
6 ?; t: W3 K; S5 z5 F& `# v7 V显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。. M6 @3 x$ p) R) w4 [
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
: s% P7 N/ t) b/ \4 H6 q----------------------------------------
, I; ] W" \) s: vhttps://github.com/guillaumekln/faster-whisper
8 J ], W9 U' `安装如下:4 C/ j9 c: Y3 N3 F
1, Windows 10, Z- r3 |2 H/ W- @3 F1 c
2, Python 3.10.11
, o) d5 W L- o& G3, CUDA 12.1
0 i. x) d0 _+ c% l4, 在python 3 中安装% p7 x! u& t* q
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu1172 f1 H4 U) r0 S, M
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
; U# q8 [) `* H6 ~# d2 x( c4 ^: W* {& z5,pip install -U openai-whisper
2 e9 O6 B( H/ O3 c. e+ k* m) P% H4 [* j这是向whisper 致敬,可以不装
5 E: e& b- W- p) a1 [' u! j( n6,pip install faster-whisper/ n7 c) _6 C( p6 h6 h+ K2 _4 |: M
----------------------------------------; Q* n# @3 V# c! g! M+ Y' X
whisper 我用的命令行,faster-whisper 我用的是python。3 G; I# p) I* M4 w/ s2 r
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
) ^- S' W' N9 |
6 t U0 _, I9 L( v1 d: W----------------------------------------
/ N' S# a+ h3 F0 J8 @5 u! d! T1 V3 c6 Q3 a6 ~# n2 f2 d
from faster_whisper import WhisperModel
. {6 y! O9 X8 r6 h3 E
/ {# `( @; B+ K3 H1 P% Imodel_size = "small"0 H0 q7 q" A" C3 T) y) t9 ]5 Y
7 S6 E* p/ V! E* d1 A# K) dmodel = WhisperModel(model_size, device="cuda", compute_type="int8")
8 r7 w5 X- m6 Z3 _' v2 B6 e( {% b
segments, info = model.transcribe(2 `7 ]: o. A9 a: M/ \
sourceFileName, ) x4 F- ? E! u( }- \# S
beam_size=5, 8 f# y" W4 a5 B
language="en", $ e; i; d1 {9 o
task="transcribe",
1 X- N& X; b/ n( v+ O word_timestamps=True, ! U6 x( z- J* a/ s6 e' w6 _; [
initial_prompt = "Hello, welcome to my lecture.")" p9 r3 z& K1 g: D
$ \7 p/ d! Y0 A% vfor segment in segments:: Q: m9 v2 b8 b2 [! M: H2 R- D$ f
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
. y3 t6 Q7 y2 j4 \" p& Q2 z3 ^ \- e# o3 N) x# M- U
for word in segment.words:
. P) m" i/ ~* l/ ] + G" I" s; H0 i! t
----------------------------------------4 O2 _% r; Z' l. F- U, L+ i7 N
: {. H0 r0 n; ^! X/ m代码说明:
' e" b- O- j" r1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
" k! @% I* H: U# S" O, s& p. r9 Y7 Y但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
7 v9 d+ ]- h: O. ~ I' W" B; A- n2,segment 本身是很粗糙的,做字幕勉强能用。9 J6 m# E, d" |" Y: x
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
. J$ [6 ]% }+ r: ?9 a4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中: X+ x* ^. N' b, n+ B
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。) Z1 p& Y7 i0 y/ L+ J
5,model.transcribe 中参数说明:
N' P t! X& x7 \; Y6 D4 Y你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数3 E. K- R8 P; O1 j, g
其中
+ ~1 Y& s1 W; | word_timestamps=True,
( X5 l7 [( N W" d: _3 W8 d保证了你能拿到 word,否则是拿不到的
. F, d4 |- q+ p* v$ T initial_prompt = "Hello, welcome to my lecture.")/ q4 O3 t5 y+ i% d+ y
保证能尽可能准确的断句 punctuation,但是不是决定性的。& x. \6 u: N- U
其他参数可参考源文件: y5 _, t8 m+ K
https://github.com/guillaumekln/ ... isper/transcribe.py' }, f' q! d* W; c4 X
152 def transcribe(( ]7 T p0 }, q. z
从源文件你可以看到是支持中文的句号断句的。
' i. G, I2 s9 H7 f1 a& [
0 n5 a0 o! Q7 M& Z7 b1 k6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。" I {& Y8 ^& g/ _/ v; E7 j- X
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
# i6 ^4 C2 ~0 N0 S' v8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。. n& O9 f v8 U' i
' b |5 h; L8 D - y( C# r+ ?. W
1 p9 V$ j. ~( I: D; K+ f9 J |
评分
-
查看全部评分
|