爱吱声
标题:
faster-whisper 更快的语音到文字的识别 ASR
[打印本页]
作者:
nanimarcus
时间:
2023-6-4 02:10
标题:
faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
3 ^) C8 K) O4 K6 A: n8 [# I
) k& h( {6 s# J% X4 p
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
5 D% P& X% u$ A' }, b
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
7 M- S# Q+ Q1 m5 K( b8 ]3 N# R) n
----------------------------------------
- U# W* C" b* j5 W& A( w* I
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
0 h0 y8 o- s# [' ]$ I; [
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
; y0 ?, p! C$ X! ?
----------------------------------------
3 x6 E( R6 W6 p& k- C
https://github.com/guillaumekln/faster-whisper
3 Q: l4 U9 h6 [4 M
安装如下:
- _ ^/ L# a* t" ?
1, Windows 10
! x- T; ~! ]" c/ `+ O' `
2, Python 3.10.11
. |) b" K( Z( j; W' j! F1 J
3, CUDA 12.1
7 r) r8 U& @: u5 U$ u5 P
4, 在python 3 中安装
: Q% c" ]$ I5 h% B% ]; u. s
pip install setuptools-rust torch torchvision torchaudio --extra-index-url
https://download.pytorch.org/whl/cu117
# g6 ^8 [5 T7 u$ v' j+ P
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
6 D2 W) Y5 K* h, Q7 X( q& S0 j
5,pip install -U openai-whisper
( V- M( D) `, k, n! S$ ^
这是向whisper 致敬,可以不装
8 A% A0 w% L$ w; T* U
6,pip install faster-whisper
) G, B6 t2 V0 e
----------------------------------------
7 |$ c9 g9 k4 Z6 N
whisper 我用的命令行,faster-whisper 我用的是python。
3 y# ?/ {! q/ i: ~- h% `
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
- @1 ~( O2 `" ]2 b* w
: E+ h% V! H8 ?, m* u5 E$ x
----------------------------------------
% {/ L g; |. N0 l
% ?% E& }0 z: o: g! d X9 Z, X% \; c
from faster_whisper import WhisperModel
B& C% q- p, k L( W
! M8 o# W1 E7 j! L/ p" l* [& _
model_size = "small"
v+ p% k" w0 u6 \5 t
( d4 z( r6 F, n6 ^$ G# H
model = WhisperModel(model_size, device="cuda", compute_type="int8")
+ ^; h# @% c S; n- ~3 R! h7 N. t
7 ~/ B, Z4 C' O' Z8 Q! d
segments, info = model.transcribe(
! ^$ d4 S5 n. Q5 Y4 A6 z% n0 P
sourceFileName,
+ k7 k' w9 K( n% R
beam_size=5,
# ?) ~9 w5 n& N8 H
language="en",
/ Y/ o0 v0 z6 l0 S: |4 J& Z( v$ J
task="transcribe",
6 A J9 _9 ]! m" @# m) |! D' |
word_timestamps=True,
n* }" j+ L9 v7 u+ ^" q Z
initial_prompt = "Hello, welcome to my lecture.")
) D1 O) l( ~% s- F5 k! m. J
7 i% C# D, b$ i, Y
for segment in segments:
0 e& P( E1 X$ A$ r5 U
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
! V- Z' T) u; @1 I
0 e/ x8 p6 o0 ~3 Y+ i/ Y( h$ V/ ]
for word in segment.words:
0 Y0 ]4 e% T% e) e7 u
6 \- K; a+ ^2 X' H0 K4 K5 c2 g
----------------------------------------
- s0 F+ F+ `$ p: E7 F
5 Z+ h7 V: R3 `. x7 Z/ m6 z
代码说明:
# x5 Y& i; O2 Z% r% e$ t1 [# |2 Q* F
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
& i7 U0 G! ^; ~) W& X
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
) }. K% o! c7 H# Z! T, D" o2 r* K
2,segment 本身是很粗糙的,做字幕勉强能用。
% F8 u! u6 k9 h
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
2 X) R# B$ L# e. v' J9 D
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
3 j$ T$ X- x( b: P! [( A
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
9 {6 Q x2 W- a$ S W) S4 W8 B7 ]
5,model.transcribe 中参数说明:
1 G* o& C3 }; C
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
( |# T) O" \ p5 {9 {0 j# G. Q' j
其中
3 e5 m: w5 ^- N4 V; `
word_timestamps=True,
7 J& v# `5 M0 @7 Y' _
保证了你能拿到 word,否则是拿不到的
1 p9 F5 n' \: ~" Y: R: F# H
initial_prompt = "Hello, welcome to my lecture.")
5 O0 e. r! M6 U; z0 k
保证能尽可能准确的断句 punctuation,但是不是决定性的。
3 }; e/ c% t8 y) _3 t, V9 G8 v
其他参数可参考源文件:
3 R3 ?: C& b u3 D
https://github.com/guillaumekln/ ... isper/transcribe.py
8 Z' _8 V6 [8 ?0 G
152 def transcribe(
! A: C; x* g7 P5 T5 |$ p: l9 T
从源文件你可以看到是支持中文的句号断句的。
) D1 h- [- w: ]$ [. y3 n
3 i: g# m4 t, @- ]
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
* B8 j% ^+ Z- l+ O3 J
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
$ [, F" A3 D* V* i$ P' O" ?
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
# v9 b2 U O0 }
0 ]' |$ _+ f" q0 m
' z7 m8 v* E" b& f! K0 K. @! _
. L' H: k+ \# B& d
作者:
nanimarcus
时间:
2023-6-4 11:53
多谢各位榜爷打赏。
欢迎光临 爱吱声 (http://129.226.69.186/bbs/)
Powered by Discuz! X3.2