|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
: W! c' @: r( ?3 m0 \9 K/ U
, e4 y9 J% P! o o3 P; p借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
0 A. u! T% p/ i# _& u效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。# l' D; J' p2 q+ g# o$ w
----------------------------------------6 F9 @' N8 E \$ G& B
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
# s+ r0 G1 [/ E+ }' z% v在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
& `" ?9 f- r7 b----------------------------------------7 {/ {/ i7 {0 X1 k- d0 X, ]
https://github.com/guillaumekln/faster-whisper
$ k8 B% c+ r* O) Z T* y安装如下:0 L: {, |- a, B2 q9 w4 T! }
1, Windows 10/ b3 q$ w2 P' p
2, Python 3.10.117 w6 @8 V: C* w# g
3, CUDA 12.1* ~: P3 U9 m1 O6 [1 R7 ~
4, 在python 3 中安装
$ p) C+ R: S0 Cpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117: o6 v# A, p9 q, O
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。7 g4 {6 O1 \' z3 N
5,pip install -U openai-whisper
5 ?1 |: L- y7 Z. R5 B这是向whisper 致敬,可以不装# n7 H' ]' m$ v2 K+ x4 t
6,pip install faster-whisper! |# V+ [/ U' ?- V k- b( x
----------------------------------------
, [7 T2 ?, S8 V! X' V& X3 G* \whisper 我用的命令行,faster-whisper 我用的是python。
$ r+ O. }5 b s. ^下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:7 a) S8 I' v6 [4 R; S( ^6 I
7 N7 ]3 i6 o4 f' G" ~+ t+ V0 X
----------------------------------------5 E' |9 C% g' e; ^
# `# S2 u% k+ M( W) l
from faster_whisper import WhisperModel
9 _1 V4 L2 r0 Q" z3 _
) G8 @) `) t0 dmodel_size = "small"
% X. }; ]3 L) ?/ f, R: ]# }& O! E. W# `* L7 T/ T% e3 C1 M# i
model = WhisperModel(model_size, device="cuda", compute_type="int8"); u3 s/ ]/ @0 b. A! p2 J9 B) m
8 s" y Z6 O7 z# ^$ b+ Y' j
segments, info = model.transcribe(0 j+ ?. f: H) D7 |/ j$ L) u
sourceFileName,
. `0 D1 g' v# o1 v9 p2 B4 `" ? beam_size=5, . }. }& ^0 t! v9 {
language="en",
/ _# l. C A: m9 _9 S9 \7 x task="transcribe",
" a7 ^5 [2 { ?8 Z/ X( A word_timestamps=True, 1 A/ s4 B! O- p' V2 k
initial_prompt = "Hello, welcome to my lecture.")
( r* S7 g, `- W# ?, f2 b* ~$ z1 C7 z; M; D$ N3 `6 i4 j, G% h
for segment in segments:4 f* D" O, E H0 s5 l' t" a( T9 R& N
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text)). s2 L% y$ x# ]- P* r6 I
% h o! }& W6 [* v+ P! v- Q7 |- ` for word in segment.words:$ n1 x6 V8 ~! F# ~0 H3 z" y. L
0 {, b9 h3 w! X+ [: O5 b. Y( W5 }----------------------------------------
9 @/ W, `; R" r2 U: j- P+ b" I8 s, C* h. f
代码说明: ?# q0 u) s$ q7 C0 q" f
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。6 C; w7 r7 D( P* M* s
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
k3 _0 w0 R5 w2,segment 本身是很粗糙的,做字幕勉强能用。
* l+ T6 Z* f$ [( e; Z2 o8 I9 G4 X3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
/ `/ f6 t+ D# L- @# R7 E" r5 x4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中/ @3 h) V0 p( R) o$ H3 ?7 J; V" w4 ]
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。% V1 w. V2 {9 A+ {6 L \4 I. h6 R
5,model.transcribe 中参数说明:8 s4 z% n3 ]% j& h; f. `
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数9 J5 n7 w2 i& a5 n% `
其中
9 U" V' D j1 a5 J; e. L! [ word_timestamps=True,
- W7 S9 \# z' x保证了你能拿到 word,否则是拿不到的- V' Z7 K0 M% |, I' z
initial_prompt = "Hello, welcome to my lecture.")( ~7 O, D* w q$ W' C' [1 _: k
保证能尽可能准确的断句 punctuation,但是不是决定性的。
/ ]( C; x$ m; U* O其他参数可参考源文件:4 }' H r2 s: ?6 z0 I. W
https://github.com/guillaumekln/ ... isper/transcribe.py
) ` K1 I# `/ s2 W/ ~1 M152 def transcribe(
- w1 Y0 \, }* D1 M' Y* @& f从源文件你可以看到是支持中文的句号断句的。
& F/ ]$ j! G4 F6 C; T: P# \7 k; {& }. M0 J+ x1 c' f( U I
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
# k+ |* { E3 V( f. Y. x( \$ _7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
( C% }' }- j# f- Q: {& Q8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。) L; @2 Y# P% E7 g* I: J; |, a
; k8 y% X! u9 F& W4 f : U3 I: V1 `' I1 g4 S
3 A& {4 ?* |) U2 K |
评分
-
查看全部评分
|