|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 ! K# l2 y- m% |! D7 ~5 @
4 i0 H9 k& X4 M( {; `" u3 t) a借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。' C; {% Q: m; \, r( ^
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
2 ?+ k7 N7 | |. `0 W2 L# v----------------------------------------6 u! Q2 v5 n9 ~4 v U! q3 `
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。4 c0 U& J3 u$ b, D8 Y1 c% {# M& C
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
% ^! G+ G# @, `0 n) b% A" D----------------------------------------
4 b2 x: M5 o& D3 @& k9 bhttps://github.com/guillaumekln/faster-whisper* E- Y: i q# ?8 n* P
安装如下:
- M7 [3 N! _0 H( t! u4 ]1, Windows 10
; P. L* A; t1 n) M3 q- v. H6 s2, Python 3.10.11 ?$ j" c. S9 h$ a/ H; x3 z+ Q
3, CUDA 12.1) i$ |6 B4 \! }7 W, w* [( F# ?5 |% e
4, 在python 3 中安装5 @, ~6 N3 E1 ~
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
" ~7 |$ S n9 N这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。9 C$ {' W4 k5 B9 _4 s# L0 ]) Y+ ]$ I
5,pip install -U openai-whisper
$ `' @% H6 x" a这是向whisper 致敬,可以不装
; ]! `# Y8 ]! k: F$ M6,pip install faster-whisper
( V9 u0 Y3 i) o----------------------------------------
6 L9 ~- J/ y7 |! \( P2 \- A7 \+ Awhisper 我用的命令行,faster-whisper 我用的是python。
: K$ ]5 |( ?1 Y+ C Y2 K下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
" |8 c7 f0 M: t- L" S
, m1 z& D, H% v( u----------------------------------------! k2 o: O- I( z3 h. Q5 p1 f
: I+ }+ n! y% k+ I _5 E$ M$ D
from faster_whisper import WhisperModel9 j7 C" p2 \1 K/ [
4 U1 p2 [* F I/ k( C8 \model_size = "small"
: ?% M+ D+ N" t! ]
" h' T' X8 a- K: L* ^ l' emodel = WhisperModel(model_size, device="cuda", compute_type="int8")' M k0 W8 P# ~$ S: @
0 R5 q! Y6 \9 ]) P. @/ w% j5 tsegments, info = model.transcribe(/ u# B( W* B, L+ `$ X8 w
sourceFileName,
8 |1 D3 {5 v- S) } [ beam_size=5,
: V9 ]( N& _- D6 g( {5 A9 U# y5 D language="en",
) I% `. }9 x$ D# @ task="transcribe", 0 o& }0 _& f: v% u0 w5 y
word_timestamps=True, 5 K S# B: k0 o# E2 Z5 ^. l0 _" ^" `
initial_prompt = "Hello, welcome to my lecture.")
7 g" }. C# A! t4 g
1 A: a9 U: s+ b+ ]for segment in segments:
2 Z5 F* B9 G/ W; u F# F print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
) Z$ k# O' v+ b2 K
6 V2 C+ @( g1 Y4 V. ` for word in segment.words:6 Y R0 \$ T5 {7 w) K
( Y: @3 P& M4 M: s----------------------------------------$ R% t5 f+ J% Y s1 _
) a6 j( Q: f4 ^( {6 E) K% U3 m代码说明:
' T- L S1 i! V: j/ z9 ^3 l3 q3 c1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。7 G( d p, f5 ] ?
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。# R* S* _7 k$ T! \- {8 S' E/ D: k
2,segment 本身是很粗糙的,做字幕勉强能用。4 M6 ?2 Z$ l0 i) G/ b3 ]
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。, B! P* O, U# \* n- }7 k' a$ Z
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中5 Z! l4 w1 S) Z" Q( c
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。: H! ~ o6 u& Z; a9 l# b
5,model.transcribe 中参数说明:! u5 D7 T. H) J
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
& h4 w1 H; J; P4 e1 _/ f其中3 ~' b8 b0 B, @. s; u8 `% n
word_timestamps=True,
( o* H i; z8 r2 w, Q5 ^1 A* W保证了你能拿到 word,否则是拿不到的, d; P% l% ]" p% }; w9 P1 _
initial_prompt = "Hello, welcome to my lecture.")
/ f7 Z5 ]" C" L: a- k保证能尽可能准确的断句 punctuation,但是不是决定性的。0 s _. v- F; a7 {) \
其他参数可参考源文件:
+ X) ?0 B+ E9 B7 T" i& uhttps://github.com/guillaumekln/ ... isper/transcribe.py; B/ D- W) z2 W. \
152 def transcribe(/ w p: p5 [+ d5 F$ {" {
从源文件你可以看到是支持中文的句号断句的。: K1 n1 N" W& n+ t( N- h0 l
: O$ I* ^' w/ K: y% m" s) b: q6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。# ^' E2 p; M+ m/ }# R9 P2 I
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
# f9 F+ Q# u/ {6 J, u8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
* j/ f9 {0 s# i3 ~% n ?2 Q( y$ W1 V% ^$ i( {: _) I! S. u
; Y7 q6 P1 w4 Q) F' j3 @- d
! c; K+ p9 a; v5 q
|
评分
-
查看全部评分
|