爱吱声
标题:
faster-whisper 更快的语音到文字的识别 ASR
[打印本页]
作者:
nanimarcus
时间:
2023-6-4 02:10
标题:
faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
8 E8 P0 \) q' @# I& `
3 ]0 j+ L2 d7 A+ D
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
5 J0 ^% m* s% [1 q/ s2 d
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
5 f- [1 |4 y7 q, l% C7 ^
----------------------------------------
2 G' I( \. [8 E' y3 u- b
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
! ~0 [# {, Q4 W m i
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
2 ]3 Q1 o% W9 i2 r( |: L1 [4 D
----------------------------------------
j) l M9 J% J4 z5 T# C# y# ~
https://github.com/guillaumekln/faster-whisper
& t& E1 F8 x8 S, ]
安装如下:
6 D, P9 E% E9 w! L1 H6 ~1 p: D% o
1, Windows 10
+ d, z- v) r7 \. \1 g* p4 R
2, Python 3.10.11
1 `4 n5 F5 C! y4 F, r" ?
3, CUDA 12.1
$ t3 o3 ]! T m' u, h9 m% L7 |% y, q
4, 在python 3 中安装
+ B1 O' ] D6 C, B5 q% |
pip install setuptools-rust torch torchvision torchaudio --extra-index-url
https://download.pytorch.org/whl/cu117
8 l6 Z8 P a1 p |
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
" m( C" @7 f- s2 v1 a" p
5,pip install -U openai-whisper
1 k* y7 ]4 X) r; f9 V
这是向whisper 致敬,可以不装
" I7 r! T' S/ c: I1 u6 s
6,pip install faster-whisper
) j% }7 [- U) F" Q2 `; H
----------------------------------------
0 N+ R5 g$ j3 S
whisper 我用的命令行,faster-whisper 我用的是python。
1 A7 k3 Z3 i7 r7 ?5 @
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
8 B. n* Z, u7 V- m! r" y5 O: T
1 U% Z/ m$ j6 {7 G
----------------------------------------
* `% n' V& I: t: \* f2 ~) k% `
0 Q( v9 l* r q+ ^9 I" b9 |1 P. L; J
from faster_whisper import WhisperModel
. g1 ?5 s0 `8 a c
5 d& w: J/ `! l4 v
model_size = "small"
' V$ z; T) p& u, _6 K
) o i; P$ a! K. Z l
model = WhisperModel(model_size, device="cuda", compute_type="int8")
* _5 e5 |# j) A. a" u$ E
8 V8 S) t$ J6 z0 h8 l
segments, info = model.transcribe(
3 g; X4 V4 I( H$ K
sourceFileName,
* E: Q- m# P/ g/ H$ ?; V e
beam_size=5,
' g2 _; I% L# G, F. e
language="en",
0 s p* e: d/ s$ A; x8 s
task="transcribe",
2 a- M# j+ i; U0 t- j7 A+ C6 W
word_timestamps=True,
j5 s% D1 W/ x! o0 p& ]
initial_prompt = "Hello, welcome to my lecture.")
6 Q' F7 Q. b' z$ p/ o4 x& l4 R1 ?. I
! L( r+ {$ z8 H3 R2 Q6 K
for segment in segments:
; l0 A$ i* x" c
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
! ?" S0 s8 I: Z6 U5 O
& }( v4 ~: _9 @1 k7 u
for word in segment.words:
`) u( f3 H' @$ a, _" c9 e/ j
8 u( B# e7 v7 d& ]% Y* k5 [0 X
----------------------------------------
! e+ B6 e# \* t
7 F) m8 t: |# ^% D* m; _
代码说明:
5 i' L7 ]& D. v9 b( j! s9 B T
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
& f% `: I2 }' r; ?% e; ^+ E
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
' j ^3 }) P$ K8 R7 T C
2,segment 本身是很粗糙的,做字幕勉强能用。
5 r: S! t7 s8 p/ X
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
) C" O; @/ [& y
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
6 b* N" a y# Z9 W" F/ z. m' H
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
: T$ L/ H' @; r, ?3 Z; s* |: |" O7 S; c
5,model.transcribe 中参数说明:
3 [5 n( }( U: {6 E2 O0 d
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
7 T/ R7 w. _, P3 `3 s2 }
其中
* d5 O5 E3 k- U) \! |! y2 S0 U
word_timestamps=True,
8 ]+ ]; }. e6 ]5 a
保证了你能拿到 word,否则是拿不到的
' u! T2 |, ?% F t
initial_prompt = "Hello, welcome to my lecture.")
! Z& S4 G% P! i) q2 @2 F
保证能尽可能准确的断句 punctuation,但是不是决定性的。
) u8 p6 T5 v4 |( Q& F+ v
其他参数可参考源文件:
1 T5 k3 y l0 G T
https://github.com/guillaumekln/ ... isper/transcribe.py
- C' @1 e& |3 c8 L6 y. Z `
152 def transcribe(
3 z1 b) e2 L3 q2 c
从源文件你可以看到是支持中文的句号断句的。
: _ Q4 k: O+ g! Y+ N0 y
+ V, T8 ?$ H7 A8 U) C' F
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
- M; F4 ]+ t) k4 L9 V# ^
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
8 V. Q. L, k/ M( M9 S/ C
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
' S, N* g; N& B5 Y X$ h# z9 g6 Q
4 C8 v# d5 ^/ K8 a! _
* E1 L8 |8 Q0 q* q0 W
' z/ H. J* j' [: X8 H; L
作者:
nanimarcus
时间:
2023-6-4 11:53
多谢各位榜爷打赏。
欢迎光临 爱吱声 (http://www.aswetalk.net/bbs/)
Powered by Discuz! X3.2