|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 ) ~% P$ \% ]7 q r
$ `3 Y: L, }' R* a9 h+ T& K! \
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。- ~& _: r+ u2 I: t! W5 E7 u
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
1 v7 _ D- Y2 _+ [; @----------------------------------------$ ]6 q* H- @, `7 }4 e
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。! r- P" W8 i. V& V* K$ E# i0 e
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
3 h5 N1 e3 m, [: y' \----------------------------------------
2 o9 v2 q$ O/ O V* {) }- L& h% _https://github.com/guillaumekln/faster-whisper& M- q$ g( `/ ~' H x- q* ~
安装如下:
0 P0 A9 F( }7 L; B( L1, Windows 10
; e" Z( x; W; n" ~2, Python 3.10.113 t0 o8 K- G: E0 ~+ N8 j: Y( N6 W* W
3, CUDA 12.1
& S6 C8 R8 w5 b; n+ i6 _4, 在python 3 中安装
g( w$ Q- S3 q% _7 n" dpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
; O& ^4 s& w7 X* C, I# ^; V- _) f这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。0 |' c1 H( `1 y% Y9 L M4 b; o1 g: }! p
5,pip install -U openai-whisper( @8 z* Q0 q# ^+ e' t
这是向whisper 致敬,可以不装
$ x2 X" g$ E7 t- b8 `+ x/ H6,pip install faster-whisper
; }9 Q" [' d- _6 K* A* }----------------------------------------
) A) _6 l! ?2 n% a# E5 S; E/ hwhisper 我用的命令行,faster-whisper 我用的是python。
5 x$ G/ O, v' ?6 I下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:. [3 q: H; v2 S) h
( _$ m) u+ u, ~0 s0 Z7 U( v4 _% p }----------------------------------------
- I8 M2 C( b) Z% t3 \- j# m
4 N6 ]5 A0 Z" ~# N0 Wfrom faster_whisper import WhisperModel
# U" ?: m1 W/ C% M& i- d
, t9 Q& t6 q- e& h4 K. X9 ^model_size = "small"5 A1 e# [3 k* Z- T/ L" a
+ i; O! f9 f* {; B3 Q
model = WhisperModel(model_size, device="cuda", compute_type="int8")6 v* [3 Z! I7 E
3 f3 v+ U/ s6 S- k) a% `segments, info = model.transcribe(* ^/ E! J* t7 e# F
sourceFileName,
, S" b* B( M) h2 A1 q# O0 c( x: a5 V beam_size=5,
* v5 L) p3 ]1 m4 y$ A* d: Z8 Q language="en", S. A8 y+ H" C f
task="transcribe",
4 t- f- C9 }% K& q0 C/ {( |; f2 Q word_timestamps=True, / _; I, ?! b: I$ o/ T4 g
initial_prompt = "Hello, welcome to my lecture.")+ o% o& [3 g9 ]/ f$ q! @
! A9 j$ b! P5 D" T0 P3 m. H
for segment in segments:
' _% X5 }; c2 p$ d+ l! F print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))6 i% w3 h. z1 n5 G) z
8 q5 |; e/ U( W$ e) j6 E4 Y4 Y for word in segment.words:5 V4 i6 @1 E; Y+ j& r
/ B9 x& U* R% e ]$ O E* Z' t----------------------------------------
" k1 d2 B0 p: N* A% M+ g0 u( A8 N% `
代码说明:" `0 z; \$ Y/ J$ `3 M9 @
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。+ A5 E3 q/ o7 X
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
" F2 B4 I( e; Z+ }2,segment 本身是很粗糙的,做字幕勉强能用。# T6 ^ a7 z' n
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
2 X2 P' I" G8 Q/ {4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
8 e3 g4 C$ s- {, ]比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。6 ^! z* Y9 m( H2 F9 P7 e
5,model.transcribe 中参数说明:
+ M' T( G- Y1 n: L6 u: D你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数/ i, P) X T, c! g6 a U+ R( E L
其中 L; ]2 I1 e. z" _# q
word_timestamps=True, " C, B8 ^0 c6 i" q* t( `
保证了你能拿到 word,否则是拿不到的/ {% R0 T% h# p1 Y
initial_prompt = "Hello, welcome to my lecture.")
6 ~1 P" d6 o- P1 o1 x) j保证能尽可能准确的断句 punctuation,但是不是决定性的。8 p F# x: X5 x- C! j
其他参数可参考源文件:8 I5 _1 W* V/ ]
https://github.com/guillaumekln/ ... isper/transcribe.py0 `2 c0 `. [5 e3 u% m/ }- c2 h
152 def transcribe(0 j2 P# t' ~2 v [" k5 g) c/ W
从源文件你可以看到是支持中文的句号断句的。
! e) j7 r7 E0 ?) f
: P% ^5 ]! ~4 F. Q+ w- t3 y0 C% G6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
$ d/ Q% u# G/ X2 M7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。+ g' m4 @8 q% X* C
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。: T. K0 ^* I; t# r+ {$ A
; |4 d5 U# \! W
7 G( o9 q: v- C. L: i- h- @; [1 S8 `" d) r) R. s
|
评分
-
查看全部评分
|