爱吱声
标题:
faster-whisper 更快的语音到文字的识别 ASR
[打印本页]
作者:
nanimarcus
时间:
2023-6-4 02:10
标题:
faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
, [! G* F! I& c
0 O8 V/ m# Z1 }4 }3 g( Q5 \6 G I
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
( |/ s& N0 `$ H8 f1 T' S3 q
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
2 V2 z4 s" Q) E: {- F- k: f
----------------------------------------
) f( r" j/ @- X3 H9 R1 a) I7 n
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
- P( l2 l( m# C( G9 }7 C( Q
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
! h# {6 W) u8 J5 G; M1 O5 X9 F
----------------------------------------
) {# [7 |% B) L0 p- a
https://github.com/guillaumekln/faster-whisper
6 v* q2 D3 x/ j3 _- h
安装如下:
. m& I) b% g* B$ o, J1 S0 F
1, Windows 10
: F. ~$ |$ p7 M" z2 n% _6 Z% m0 |
2, Python 3.10.11
' ?" H2 X1 d: I' L% i
3, CUDA 12.1
' m$ b2 w2 w/ T4 r! A8 ]
4, 在python 3 中安装
0 D2 L! Q: q. w9 L& K' G3 z* a
pip install setuptools-rust torch torchvision torchaudio --extra-index-url
https://download.pytorch.org/whl/cu117
( ?/ }9 ?: m+ a1 j, R
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
6 [5 a2 j {8 }
5,pip install -U openai-whisper
* H( R$ h- v- z v4 b
这是向whisper 致敬,可以不装
3 p8 T7 `) ~4 K. \/ s
6,pip install faster-whisper
* v0 j' Q7 U" ~4 q+ o3 A$ m
----------------------------------------
* T& a1 z$ b+ K
whisper 我用的命令行,faster-whisper 我用的是python。
2 K2 T7 m" q3 {! w
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
6 ~* S5 r4 N2 J) p
: H1 p. F* L3 o
----------------------------------------
9 r+ N+ p) }3 w( A4 P! C! k
/ f- f* _9 }2 j, Y5 c
from faster_whisper import WhisperModel
* F0 ?, t: G% f
3 r# ~+ m& X0 m9 a" s) x7 Q
model_size = "small"
2 ~+ K# U4 `) D; N
7 U, `6 F( e$ e( H8 C
model = WhisperModel(model_size, device="cuda", compute_type="int8")
! X) w; ^( S' a8 h! g0 x+ z
4 q. B( W% }1 w
segments, info = model.transcribe(
! q( D* a' u9 ?6 M( f1 R# ^# z
sourceFileName,
8 [: P; {' N1 x0 L/ b
beam_size=5,
3 p0 ?% N5 Q ?2 N. G
language="en",
& l$ Q& l) Z; p* f4 S/ B8 M
task="transcribe",
5 K- A( Z0 I& r0 E
word_timestamps=True,
7 V, `, q6 @% i3 V- L
initial_prompt = "Hello, welcome to my lecture.")
( x( ~) ~6 ]( y$ P7 G' d
; V: ^6 [- h- G- Y) ?$ S
for segment in segments:
. x. x2 `* T" }; ^
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
/ F/ ^* y& }8 K# |/ u( D6 Z
' y# p9 Y% x! ~' Y5 n) q
for word in segment.words:
$ _9 d$ C( L: X6 `1 [+ }1 P
$ Z6 F; ^6 t P# b; l# r) J1 O
----------------------------------------
7 P7 X1 U( b2 Z% K' a" N
* M7 l h( g9 X2 J8 B3 X, J& t
代码说明:
( @8 B, E# Q# T/ K- I/ R
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
/ a# w- j$ T, J1 n; x
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
2 o- U. \# n3 M5 r/ h4 M2 N
2,segment 本身是很粗糙的,做字幕勉强能用。
) u8 {3 ^. n6 q! P; b
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
0 o6 Y. I: h5 Y. {. G
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
" Q3 a7 Y N2 ]' ]* _
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
& ?* ]" A: I) ~8 B% R
5,model.transcribe 中参数说明:
1 n- c3 b8 v" I# f# x6 ?
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
, |7 O. G. H+ b; u/ G
其中
X9 ?1 U& T% T' V( K9 y7 Y
word_timestamps=True,
6 Y9 K5 g! [ A( k9 W
保证了你能拿到 word,否则是拿不到的
1 h& \' I5 K; |3 j9 p; M3 o. v3 f
initial_prompt = "Hello, welcome to my lecture.")
- O4 G, e: [ J S
保证能尽可能准确的断句 punctuation,但是不是决定性的。
; h- |- ]7 d# w/ h6 J, d: T4 [" s
其他参数可参考源文件:
9 ?0 k8 |/ w+ W" F, f, f
https://github.com/guillaumekln/ ... isper/transcribe.py
% ]( \* F6 j- Q; N% c& S4 Y
152 def transcribe(
2 c: O. S. |! c' h% L; M
从源文件你可以看到是支持中文的句号断句的。
8 ^% a/ ~0 y& H
2 q5 |& i9 z+ f8 O, U
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
% k l/ u) D9 i- j0 Y
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
0 M8 ]2 @ {% a
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
. l3 x: _% K' f, X
$ S3 i0 b" F g# q+ I' R/ Y& s
- f. s- S+ r4 L# U1 _7 M# n9 Z
* y; i k- X( H" `5 n, N
作者:
nanimarcus
时间:
2023-6-4 11:53
多谢各位榜爷打赏。
欢迎光临 爱吱声 (http://aswetalk.net/bbs/)
Powered by Discuz! X3.2