|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 3 u5 r7 q. M q6 \
! }5 q1 Z( g* T借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
7 Q' m( D8 m0 v8 ^ t8 S效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
3 J1 ?2 j$ `" j----------------------------------------
& m. D3 d" ^4 s/ R% S显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
/ z# O& }. y' G! I在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
( w% t p6 o' p! g----------------------------------------+ W. d* g: @2 Z# a
https://github.com/guillaumekln/faster-whisper' y4 @6 t% ]( t9 L! n4 {
安装如下:9 L5 C$ D! c: g) V0 C L
1, Windows 10
; [$ m: h" W- R5 X2, Python 3.10.11* L. s0 v3 O2 ^6 C% h
3, CUDA 12.1
0 }, [/ c; Z* H0 i& F4, 在python 3 中安装
3 ^) }" r( y6 cpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117& |7 a5 @; O$ u" J. r5 F b0 B& G
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
* p& x6 B1 B! n( o5,pip install -U openai-whisper
# T6 z4 V0 |# O' i这是向whisper 致敬,可以不装
/ o: a" z* }! h. X f6,pip install faster-whisper
" l- Q5 [% u( ~8 a. D9 z+ y- Y----------------------------------------) g4 h8 Q( f9 Y" W+ Q% d
whisper 我用的命令行,faster-whisper 我用的是python。
% T9 [; z* T$ V下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:2 X/ u# ] _8 n' E# Z$ U
5 A' S) l) F1 D+ p. h+ z; ~----------------------------------------
. c/ w6 G h+ F7 G+ x5 Y) z9 C7 ^. ]" q
from faster_whisper import WhisperModel
s- f( f; M D( Q8 I1 _0 @0 I5 B- t( h
model_size = "small"
0 a! h, s8 N8 Q& M) d, q# w1 B) ~- T6 u' o6 P
model = WhisperModel(model_size, device="cuda", compute_type="int8")8 j% v, P; G7 ?0 n
6 [* s' s/ Y$ }3 M, ?3 W
segments, info = model.transcribe(
1 A& R8 b& F( S% n5 L sourceFileName,
, Z+ Z6 x/ } O. T; E) _ f. o2 G- g beam_size=5, " V5 z" E8 O8 G6 U# v
language="en",
2 [3 Q2 J* K1 g% ^+ Q task="transcribe",
; Q* I& l/ G3 b6 }: _2 n word_timestamps=True,
& }- B4 j# q0 `0 N3 ^ initial_prompt = "Hello, welcome to my lecture."): E: M% o- l! x
4 Y8 Y& r- Q$ m! k9 W% u# |( n( F$ Z
for segment in segments:2 U$ h. g: {2 q& j1 f: C
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
3 _ j/ u2 h' Q+ J8 h# \/ C/ V5 U6 o3 ~$ z
for word in segment.words:
. P3 m& M5 h+ k6 y. H q
7 ~$ q( D9 @" X) i0 [----------------------------------------
; @2 K2 D. d2 A- C5 u/ `( M" E* Q* K5 t: m& c* ~) ?
代码说明:( w9 O9 o' S7 y9 N
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
/ ?0 C% h1 K& s$ S" J但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
5 f& P1 C, ^9 q2,segment 本身是很粗糙的,做字幕勉强能用。5 M9 ~' p4 @( m5 R( u$ F" R; P
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
' w, K4 p6 L5 [* K4 B( m4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
: ]) R0 k9 H- z. g ~比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
) }2 F/ q% c/ Y5 d% C5,model.transcribe 中参数说明:/ e- Z# w3 q; c' C
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
) F" s2 g/ [6 t6 n其中: R, z% X% m3 i) H0 y0 S v# e4 u
word_timestamps=True,
8 d0 b( c' j1 w9 Y9 }9 ], l保证了你能拿到 word,否则是拿不到的! B/ ^) r5 Q$ L0 ^1 _" A
initial_prompt = "Hello, welcome to my lecture.")8 o. P$ ^0 g2 S0 a: f0 d
保证能尽可能准确的断句 punctuation,但是不是决定性的。
( o, {, u' E2 p" i) b7 N8 j6 {其他参数可参考源文件:* _/ C: ^+ ]" B# q3 H; v
https://github.com/guillaumekln/ ... isper/transcribe.py
g! ~1 W0 x: }4 Q4 W( G9 ^* I; W$ v% f, o152 def transcribe(1 O4 q; y* [. ?
从源文件你可以看到是支持中文的句号断句的。7 g X+ e6 T' m! Q
4 n5 _7 V( W6 l$ `& f! [
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
" }4 {5 ?2 V. F! b6 C7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。" {+ G! M/ q7 Y3 o8 d9 [' a$ J- V
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。8 R4 W. W, r1 |( [: R: b
% `' S# v' B( i% W/ O
4 z( t# x; m+ C! c5 E g D* Y2 o: K3 \; u* E3 W) g3 i2 Y
|
评分
-
查看全部评分
|