|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 6 `: A3 v3 k# _! q2 N) H
0 [8 z% n3 Y+ `% o. g+ ?0 M借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。; k; ^. o& B+ s' a5 p
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
- A9 `8 Y' z. i----------------------------------------
7 T( Y- U& N2 N b5 A6 h" H显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。& u5 g" g! B/ k" O8 ~- e
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
O) t; w$ f8 K* v----------------------------------------2 h3 N7 c' U9 q3 f1 [
https://github.com/guillaumekln/faster-whisper
+ Z/ u/ V0 t! o% R. K) e安装如下:
! y* m- E( C9 z. b1, Windows 104 L& z% e! Y0 t+ \ I
2, Python 3.10.111 Y! Q, \, j1 U) L e, G
3, CUDA 12.1
3 k# S' Z' W& j4 D+ }6 y4, 在python 3 中安装# u/ l9 ~: p. p b' [- c: L. U/ D
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
; c& G& f1 M G) c, I! K这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。; \) @) Q, O, H; C( r
5,pip install -U openai-whisper4 h& P5 A1 U. G* d5 g+ v1 |3 l
这是向whisper 致敬,可以不装# v( Y" ]* Y& P' w, B1 r' R3 e
6,pip install faster-whisper
; t5 N# s o- E6 }----------------------------------------
- F; C5 S1 V$ \' B) X# y. hwhisper 我用的命令行,faster-whisper 我用的是python。
7 a# `) \* A' V& D- F# q5 C9 l下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:" u$ [5 g6 t/ B C8 R O4 h
. X' f3 w( ` b- m0 \---------------------------------------- U6 y. @0 c7 R: l# n
1 S2 c: \# b @- s* U+ E4 u
from faster_whisper import WhisperModel
' `7 E7 T6 ~$ D" o0 P; C9 ?) h
9 z$ o& m8 y, D7 H/ |7 H; pmodel_size = "small"
8 g- ~" ^+ n" t: Z, d9 K+ h+ {, ]5 x
model = WhisperModel(model_size, device="cuda", compute_type="int8")
. K% T7 j0 |) Z% s; k2 j9 ^9 g: @% ~
segments, info = model.transcribe(
# r/ a/ \8 f0 _% w. h6 t9 G sourceFileName,
9 `* A& X7 q" d7 n0 H0 K/ y beam_size=5, 5 } ]6 L- U9 u7 v, D1 a
language="en", 5 T" I/ O1 R' s4 i" W, A
task="transcribe",
. _9 A1 R* F; E( E9 E0 H word_timestamps=True, ; H! y d% h5 J0 F% q
initial_prompt = "Hello, welcome to my lecture.")
1 @0 n q6 |& k7 v) r% I M5 _8 X
for segment in segments:
2 C* h3 \9 E1 J& U4 f! m print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))# R; l' S: C- f
9 D& a+ W r3 O3 g6 v for word in segment.words:" A" v8 v6 ?& v' G$ g/ G g& m
( W% z# Z8 {! G----------------------------------------. v% ^! m: _& v6 r5 P3 r
& B7 G5 g$ g. f$ x- W! o
代码说明:
P& ]% ^9 S8 x9 G1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。+ m, e1 r6 \9 ? Y" E9 J7 G
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
$ `, \5 ?- z2 b& U1 A9 t2,segment 本身是很粗糙的,做字幕勉强能用。
$ ?% ~/ W% M9 m: N3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。- R5 K! ^- e* l- H
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中$ E" F9 g- d' ?9 i7 x" K
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
. c; G! E+ R/ v( `3 h# ~1 [+ i3 m& S5,model.transcribe 中参数说明:
E! b9 s5 X! u( {% C4 k T你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
0 T; A. D j! }1 {其中8 f" k; S# {* O8 j' J' I, ^; Y
word_timestamps=True, ( }) J4 s2 t. m0 Q
保证了你能拿到 word,否则是拿不到的
3 j. |: s9 d# l' ]% ] initial_prompt = "Hello, welcome to my lecture.") t6 n; x) O. p' F0 ]
保证能尽可能准确的断句 punctuation,但是不是决定性的。0 |2 K2 Q0 z$ ~8 `( h
其他参数可参考源文件:5 g9 v0 m5 ~1 ]" [: V
https://github.com/guillaumekln/ ... isper/transcribe.py
6 S8 m2 w! R Y* @152 def transcribe(" `, y& r3 p% t; N
从源文件你可以看到是支持中文的句号断句的。
1 X* P8 P4 `7 s9 |, E) H o* ^; a: ~
, B% c; ]! C4 ^- w5 z9 T% s! ^6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
6 ]2 X o4 V* o' e7 q7 |7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。2 M3 ~& K5 w a& f
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。6 D3 N( ?5 B, E0 c
( B+ B4 @. u% W, R) }, K
2 A3 G/ V1 t3 ?* O% N, s
; P3 [9 W3 w" |# A' ]9 ~$ n& i) @ |
评分
-
查看全部评分
|