|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
6 Y- r2 L4 R5 M# ~$ p& U4 {
* [2 ]( V! w7 u; `借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
9 W- l5 l# B3 i v( M# J6 a效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。% [* Q5 a) D& f" c A4 V
----------------------------------------1 {* c0 T/ s2 m1 u k
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
: H' A* ~; r2 r/ x1 ~在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
1 D& L: j, `" m( H( W----------------------------------------
# Q) }6 f( {* i8 k) o0 Q0 vhttps://github.com/guillaumekln/faster-whisper
3 a: b" _0 \ X6 E安装如下:! }0 {2 M7 }: R+ d, o1 D
1, Windows 103 ?; m* r+ c0 ~5 u* n* l) f1 w
2, Python 3.10.118 C, H% E5 N& {( H- N2 ]7 x
3, CUDA 12.1
2 A; `1 {3 Q6 q! k8 R1 e. A% S! V4, 在python 3 中安装/ O9 ?! n6 |3 S4 K# ?1 L) g) A
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
, L3 h5 x. n r, @. H这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
$ J/ f) U+ q1 Y* ~. L5,pip install -U openai-whisper
# G: K; _' o( ~ r8 k这是向whisper 致敬,可以不装
) J3 ?& q$ z1 m' q4 O# I3 `6,pip install faster-whisper
; G* g9 q! _$ ^. J. ]6 ~1 I----------------------------------------, Q/ I) P2 V- V! _
whisper 我用的命令行,faster-whisper 我用的是python。; i1 R. V) g& M
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:- o# C1 N6 i5 K6 A% s7 R5 I2 ?2 @, o3 i
, Y! F% {$ ]8 T+ X* w# @ S4 ~
----------------------------------------
1 ], V1 j* j+ T
7 _ D W8 \. zfrom faster_whisper import WhisperModel
% [7 m$ Q$ P; I% @1 Z: B' H. I9 F7 k2 B- n7 c" N; j8 ^, i
model_size = "small"5 s% r& N8 N; h% ^* }
4 Q- x3 {' ~ a u
model = WhisperModel(model_size, device="cuda", compute_type="int8")9 d% h1 y+ p% h
# E' X; i ~) z. V) i5 J9 t) A& K& rsegments, info = model.transcribe(
$ i$ k. K0 D2 Q( s, e sourceFileName, " G' m: D; o" O$ s+ |0 W& y b
beam_size=5,
% z4 h* ?7 t" Q- N& M& U6 ^ language="en", ! D G4 C, c6 y" ? O
task="transcribe",
2 ?& n- l0 W: z* d% W, P0 n word_timestamps=True,
8 N* A% t9 L; B6 F initial_prompt = "Hello, welcome to my lecture."): O7 @" I8 K% J! J: N
1 U9 H* O# T* m7 s6 e' v/ S. O7 Wfor segment in segments:
J- [: b+ s# ^" M print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))4 M0 v/ @, R. [
% M, ^( F3 y/ B for word in segment.words:
3 W9 w& R7 T% c 6 @1 u% _- \; j1 B: { J: S
----------------------------------------1 H- u$ f6 n9 Q1 [" }
% w6 u7 F, J- l" F: a; g0 G
代码说明:
8 }% ~+ q$ C9 U6 _6 z8 Z1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
; o' a) y' d# M4 B+ l! G( O但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
4 a+ g. f' [ B% W! ]( q2,segment 本身是很粗糙的,做字幕勉强能用。- f( i$ N% j4 c$ Z4 O; B* B
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
5 y% P4 x" j4 y4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
( A- i2 |4 w6 v* b/ a比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。+ J! l& n4 J/ T2 z- f& z4 G
5,model.transcribe 中参数说明:$ S/ x. t* b5 X
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数/ w- Q' R4 l4 g5 k* Y X4 C! ^8 ^
其中
0 w7 H B* D. h! ~$ n5 K word_timestamps=True, 2 j/ ?( M0 g4 L
保证了你能拿到 word,否则是拿不到的; e D& C) _6 N [+ N
initial_prompt = "Hello, welcome to my lecture.")
) ~& X2 k. I; V L保证能尽可能准确的断句 punctuation,但是不是决定性的。7 ?1 h/ S) x7 h# i5 p
其他参数可参考源文件:2 K4 e4 f: q7 t, D9 R. t% C
https://github.com/guillaumekln/ ... isper/transcribe.py9 F: A) D$ m) s& v% [6 g" T6 K
152 def transcribe(- J% d; S3 a9 C0 S
从源文件你可以看到是支持中文的句号断句的。. d2 H4 \2 a+ g$ {9 y, A, ]8 V4 y
7 b# U# a/ n* {* ~. M
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
( F6 U7 h' s+ z1 c( q, u7 c7 y7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。0 }5 x7 e7 t& h4 s% ]
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。3 N! Y7 \' y8 e$ L$ S& J
: v" P7 u4 Q/ J( _7 `
! R' [4 S6 p- y
& i3 q$ l" d" s }' y9 H2 P |
评分
-
查看全部评分
|