爱吱声
标题:
faster-whisper 更快的语音到文字的识别 ASR
[打印本页]
作者:
nanimarcus
时间:
2023-6-4 02:10
标题:
faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
. T( R% {3 m6 t. g( Y
: B, U p( u" \$ D5 g: v
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
6 h5 x1 U; I, d7 a1 @
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
8 K/ g0 A5 y/ v
----------------------------------------
: o% x/ O& i+ K3 A p
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
$ l' O) _9 I6 y. C0 x. V4 f7 h0 \& o' {
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
3 T* }6 L+ S6 ~* W3 ~4 z+ L3 z
----------------------------------------
" {# S! [" j$ `" \3 j
https://github.com/guillaumekln/faster-whisper
9 W+ ?, n% t" d1 R
安装如下:
* Q4 \0 C5 k0 p+ g) j
1, Windows 10
I) G G: [) t# {
2, Python 3.10.11
+ q: } k1 _! ?! t/ B
3, CUDA 12.1
. p- h7 b' p( V( I+ a+ n
4, 在python 3 中安装
% c; `5 S! I, U% U" B
pip install setuptools-rust torch torchvision torchaudio --extra-index-url
https://download.pytorch.org/whl/cu117
2 H0 D' W3 p2 T [& s) D+ o
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
) N( D& C5 J z' ?, O' i, Q5 v
5,pip install -U openai-whisper
) Y, N3 @0 | ?! F( b5 r; B
这是向whisper 致敬,可以不装
# e2 E! A$ m( K' h
6,pip install faster-whisper
! ?3 F) \4 j: |, ~# |
----------------------------------------
6 u; c" T; G% _4 ?" f% F
whisper 我用的命令行,faster-whisper 我用的是python。
1 ` y% ^/ ^ X+ Q
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
; K( C& {1 G8 y9 S5 P
' R1 `% @9 U8 E* w ?6 _1 A
----------------------------------------
( e8 E: {/ Y" j$ Z2 w& q& G% p# J
a) @/ T! L9 j. V
from faster_whisper import WhisperModel
/ [& Y$ {8 g% L' z
. H4 g0 \- ^' Y7 t' y: O/ [
model_size = "small"
6 B+ C0 Z1 L2 X( M; o! G8 m5 h( y2 N* w
2 `. j5 K p ]9 e1 P" m
model = WhisperModel(model_size, device="cuda", compute_type="int8")
4 o; D% R; q8 B% {2 @$ z- _
1 H. d# }, b' I: Z6 Q* h
segments, info = model.transcribe(
" O0 Y3 x9 M/ N! e/ Z1 Y4 L
sourceFileName,
2 `7 P+ p! B0 J* W
beam_size=5,
) a" S0 r4 y' A
language="en",
7 w4 E) g* ]% V8 p u9 P
task="transcribe",
" _1 d& V: y6 t. O8 W# }' s, s
word_timestamps=True,
% s* r0 {6 A8 g8 j; D6 ^
initial_prompt = "Hello, welcome to my lecture.")
' C/ O9 H/ D+ @* r. Y: K& X8 e
+ s. l2 ?' a, l4 ~
for segment in segments:
8 S6 {) _. V: {9 k3 P4 Q
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
) o4 i# M2 C( l4 c3 o( E
0 }9 O# r+ y& ?# g- v6 C
for word in segment.words:
6 ?: p+ j, U* Q* s. E
$ F6 J2 h' t: Y5 x; F9 X- i$ z
----------------------------------------
# ]6 |+ W, z& j
4 l7 y( K/ x5 w( N+ e+ i9 C0 R0 w/ V! ~
代码说明:
; p' X& T4 j3 k, A
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
9 o1 S, d7 p" z- E& f0 |
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
O0 y( ?7 O* H. O |* T. ~
2,segment 本身是很粗糙的,做字幕勉强能用。
6 O& ? u. }7 K; {
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
5 U( y6 ?3 U4 N) G
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
: N5 Q4 c9 Z$ X' E
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
7 {, k: D) K! j1 W0 L: L
5,model.transcribe 中参数说明:
) e( w. M5 M2 B
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
9 L6 R, H$ D: P9 s* ] M n: Q
其中
( z3 q& k1 H7 \- u9 z. {* K
word_timestamps=True,
( Z" \& c8 F! h- X) H/ W
保证了你能拿到 word,否则是拿不到的
4 |6 S% W' {& K6 c8 J
initial_prompt = "Hello, welcome to my lecture.")
! g' x- W$ k% D( t4 h4 v# B
保证能尽可能准确的断句 punctuation,但是不是决定性的。
6 N% [4 U2 J5 R% G7 X& o
其他参数可参考源文件:
5 p& S2 D3 h3 T# i
https://github.com/guillaumekln/ ... isper/transcribe.py
5 G6 h) q8 U/ Z
152 def transcribe(
/ D8 y% d' W8 W
从源文件你可以看到是支持中文的句号断句的。
: m0 z' B, x+ V6 s% S4 O6 F
% o2 a% J/ q) l* @3 y
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
! V( a0 ]% a: ^4 m4 T2 r! D
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
) m: W9 N+ h4 j' g$ `
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
% v: [% w! x- `
; Q3 G' H. b6 i* ^. p
6 F; g- d ^4 ~ F+ E. u/ ?
* l* B, l5 G& H( ?" a2 C6 r& ?
作者:
nanimarcus
时间:
2023-6-4 11:53
多谢各位榜爷打赏。
欢迎光临 爱吱声 (http://aswetalk.net/bbs/)
Powered by Discuz! X3.2