爱吱声
标题:
faster-whisper 更快的语音到文字的识别 ASR
[打印本页]
作者:
nanimarcus
时间:
2023-6-4 02:10
标题:
faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
8 s0 L0 E' T! A# p( I: U1 T
/ [& h% s2 ] H- D1 {" _, w$ S2 Q
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
+ W1 j* ]( K* S" }0 P7 i' R
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
6 u( i* c( ]( A, A1 n6 Y
----------------------------------------
7 j6 q4 ^. d% |+ [! c, \$ ?9 R
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
9 z* l1 h. W9 R: ]. ^! Q/ r# C
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
0 p' N$ s- t1 y' R3 E
----------------------------------------
8 [0 J2 K, D* C# k; k
https://github.com/guillaumekln/faster-whisper
8 q9 H5 ?! W, h5 m+ S% ^2 w
安装如下:
1 ^3 X+ s3 j. D% _/ Q7 U G \, |. d
1, Windows 10
. q+ ]' `& L y0 k* ]% M
2, Python 3.10.11
' s, Q# b' f. r
3, CUDA 12.1
6 s2 ]# M- A! y$ c1 ?, ?. `! n
4, 在python 3 中安装
; D# q$ Q q4 P& d
pip install setuptools-rust torch torchvision torchaudio --extra-index-url
https://download.pytorch.org/whl/cu117
. o* A) y# Y0 Y; e
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
% _, w `+ T: A! y+ m
5,pip install -U openai-whisper
; v% b1 e* p9 e, R3 _
这是向whisper 致敬,可以不装
5 k$ u% a/ v" I
6,pip install faster-whisper
* c$ g& M6 W; Q% K+ K4 b5 o
----------------------------------------
+ B3 }. }' f7 T" ]) B
whisper 我用的命令行,faster-whisper 我用的是python。
+ H/ t& ?& l5 [8 [+ Q
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
- l! _, h1 p1 c
6 y) L" m l# j/ C }
----------------------------------------
# ^2 }9 {$ g3 Y- y+ [; o" C5 x9 R
' g$ f: s$ s7 Y: y
from faster_whisper import WhisperModel
) t& r% m8 K4 F5 N/ A( ]9 H7 S
/ h1 J) S; ]6 B8 `
model_size = "small"
; n8 ]) [" ~4 i
. c0 O/ C1 D+ }7 l0 B6 _
model = WhisperModel(model_size, device="cuda", compute_type="int8")
! v' G0 A, H/ H$ U5 n9 v r
) E) X+ ]" z# j( X4 \4 K
segments, info = model.transcribe(
4 v f% U3 o& W1 z1 |' ?5 b, p
sourceFileName,
# x# f1 u4 [6 Y" P) ]) }3 f( s
beam_size=5,
, I# ?% [+ R8 b. o& ^* @+ q" Q
language="en",
: g: V- ~- z6 x
task="transcribe",
# Z/ U% \& P9 e5 u
word_timestamps=True,
6 y W" n8 H0 @4 z4 V, H8 s
initial_prompt = "Hello, welcome to my lecture.")
9 n4 [- L+ \0 I9 X8 N3 `8 { M, O7 y
) E0 E' l- B B6 V7 t
for segment in segments:
& p+ B* l7 ~8 i/ X
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
, ^+ D3 n1 R4 T
' Y: ~" h- C8 Q! R3 q6 L, S
for word in segment.words:
g/ q5 l9 \3 g: ^; D+ H
7 y. P( s8 h, x0 x X2 h q/ m
----------------------------------------
$ S4 s1 v6 W( ]4 l' C
2 z8 T+ ]5 M* M W. U
代码说明:
0 v; U8 L; M5 l: r/ ]8 a% z
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
4 D0 W# j& Q+ G/ m
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
9 M, Z" ^% S7 K% n9 A0 ^* o2 e
2,segment 本身是很粗糙的,做字幕勉强能用。
/ f9 D3 e- S1 S0 w$ C
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
& A, U1 s6 P6 s# h9 U# {& \
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
4 L. V; j @- g6 }
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
) r7 t" n' U6 i1 Y
5,model.transcribe 中参数说明:
1 `2 e8 M3 m4 k5 \$ M
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
1 e: |' a7 t1 @, y
其中
" ?! E- m5 w2 }3 ~* A4 G u
word_timestamps=True,
1 ^/ _& _" m' h; ?: M
保证了你能拿到 word,否则是拿不到的
N0 m3 `: P, Y( \. T0 B
initial_prompt = "Hello, welcome to my lecture.")
6 ^/ F" F4 J: G4 p
保证能尽可能准确的断句 punctuation,但是不是决定性的。
" f$ E9 F% o5 F( E0 [5 D' ]
其他参数可参考源文件:
, m; F y5 |. d
https://github.com/guillaumekln/ ... isper/transcribe.py
. T* t5 s& ]4 t$ b) g
152 def transcribe(
o- w/ |( E# U% C6 E
从源文件你可以看到是支持中文的句号断句的。
: S+ H. `; U" x$ ~
! y* J# f7 C' Y
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
9 V/ `7 V- X6 m( `) {1 Y; V, x
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
! q, N( K# E3 v! G3 E, V0 R
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
& F- ]5 g4 F0 r2 c0 U9 H4 @* M
$ @2 `$ [& D' l
* C1 C) b6 Z/ j' o( r& u" `
- S* b! `, l# u, ?0 Q! ?
作者:
nanimarcus
时间:
2023-6-4 11:53
多谢各位榜爷打赏。
欢迎光临 爱吱声 (http://aswetalk.net/bbs/)
Powered by Discuz! X3.2