|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 0 N: A) T) T! P9 B% F6 H
4 r3 S. ?* }4 E2 J. B, I5 ~. E借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。6 w. N: B0 E5 z7 Z, S
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
. y+ z% r" |: j( t0 j# B2 l1 g- j) `----------------------------------------
* Y9 _1 k5 Z- k显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。! J( G4 F2 A, l: T# ?, n( l
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
& H/ ]5 P* j3 j, g----------------------------------------4 a6 o; L" F9 K( Y, N
https://github.com/guillaumekln/faster-whisper
. P6 W- U- r( X, I3 P2 r安装如下:% Q; u# H! A# u) }: y
1, Windows 10& I$ K$ D$ l, J% Y
2, Python 3.10.11
* @: W( e& A# _; z- K3, CUDA 12.1
6 f3 L& X1 Q+ c q( L4 Q- }/ o4, 在python 3 中安装
' {! ?8 x$ ^, `. d3 U- q* Epip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
- l, N2 O( I/ M* L这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
?0 ]- p+ N* j, t6 r5,pip install -U openai-whisper" j/ t6 D Z9 h A
这是向whisper 致敬,可以不装3 H% B7 D+ r: `/ L
6,pip install faster-whisper
; y( q. F8 B7 |$ w g0 w% n1 x( ^. C----------------------------------------
8 S" x; }- h* Dwhisper 我用的命令行,faster-whisper 我用的是python。" `# w$ J n1 p" i, l" k# A
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
# _4 |5 T5 e' @
' k- y9 U, ?* l$ d----------------------------------------. x: A4 t5 M$ H6 G0 ?
% _: A7 d6 L5 D9 }7 l, h: nfrom faster_whisper import WhisperModel
- s7 a' |) c. ]% Z
# q5 P i4 y' {: k7 rmodel_size = "small"
- G0 ~1 Y" X7 ^( Z( c" B+ [1 i7 M# Z! P
model = WhisperModel(model_size, device="cuda", compute_type="int8")4 c( M% `/ b9 q
" ?: e( _3 l5 \9 b
segments, info = model.transcribe(
3 |% V$ \, w. m/ P1 L sourceFileName, 8 }- E1 [3 ]# X" K
beam_size=5,
2 _, S" s( A3 x language="en", . |" l: a2 G6 r% S
task="transcribe",
4 ?9 f, Z8 P7 s V% e6 c: l word_timestamps=True, : r4 H- v L, A9 d5 {) D
initial_prompt = "Hello, welcome to my lecture.")$ F7 s9 {8 t2 `+ E* g
" H4 h1 U+ z3 t% Z9 G) E' L9 G
for segment in segments:
! n. l7 x+ g D8 g7 j print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
; ?" X# L" Y% ~+ N* ]% f
1 a8 U5 h+ [8 D1 o for word in segment.words:% g+ K; ?/ `3 t: c, d( O/ M
# y" c0 c* ^( C/ D4 h
----------------------------------------- p! T7 I; V3 p1 y y H) p0 p
" C$ | H2 D) B) ~
代码说明:
' q5 e! o# y2 g) J- J0 W1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。 l9 \! G# P! }
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
2 Y) b9 f4 J9 D2,segment 本身是很粗糙的,做字幕勉强能用。0 ~% d5 `8 z! A+ o* T. Z
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
8 ^* J/ B: F' z7 m$ S% `0 q4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中' i h1 F& G6 _
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。 c' Q2 m0 `- \4 W3 \; o/ U/ _8 Z# E
5,model.transcribe 中参数说明: I' X& J w* o2 ~: G$ p
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数4 E9 K4 e/ d& c; U( t# q
其中$ x6 d% K1 c* c/ c `/ L. L
word_timestamps=True,
% X9 ^0 t9 I9 A3 H/ u/ x4 T) D保证了你能拿到 word,否则是拿不到的
, w' P5 ^7 H6 ~# l% | initial_prompt = "Hello, welcome to my lecture.")) N4 m8 I* I4 O' a7 y) o
保证能尽可能准确的断句 punctuation,但是不是决定性的。7 y5 e+ Y" U7 C; p7 P5 j
其他参数可参考源文件:
9 u2 ]" `, ?: Z8 u! k& ]https://github.com/guillaumekln/ ... isper/transcribe.py
, S: M) C$ D, ]& Y" J C* ~# r, \152 def transcribe(
' |3 J- X9 C9 I5 R" @' v1 R从源文件你可以看到是支持中文的句号断句的。
5 G4 Y+ I1 h: H U- R- l6 F9 S& d- f% Z6 c3 }* q# q% v
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
5 J" g. F. j. T* }7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。; P! i! t/ U/ _( r- m
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
5 c% Q, {- t- m6 A( l! j( y" |5 P
' p$ v: s" f; ?; C' c3 g* x. B
( P( G2 j, L: C7 q% q& Q' d& T9 g
|
评分
-
查看全部评分
|