|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
& K: ] o) H; p8 S4 t R' @1 x' C% P) @& A0 T
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。1 a& Y* ^# |) \
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。8 D6 j8 ~0 a& _/ d. r
----------------------------------------
1 }6 T6 Y3 d0 `" C/ C) E" l/ p显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。5 o. A/ N2 s" }# M8 Y/ m
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。! H( d; j0 W7 @$ h2 B
----------------------------------------
/ B( s. {# g3 N; h- e( T9 dhttps://github.com/guillaumekln/faster-whisper
6 I; S: f- A/ Z3 V* D% s安装如下:" g8 D: d& C5 O3 v" y- n0 n* w
1, Windows 10: w: g9 q! _1 V
2, Python 3.10.11$ t" E" q C" C
3, CUDA 12.1! _; m' `+ A. o; ^& ?
4, 在python 3 中安装
7 b+ S$ Y3 r/ d; f' }pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117! K3 D2 S Q) }$ s
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。- L9 p' u" p) W6 J
5,pip install -U openai-whisper( Z) }8 A. U6 Q2 j- j0 }3 N
这是向whisper 致敬,可以不装
/ U) W1 j! K& C6,pip install faster-whisper2 w! m$ V+ t1 s1 m2 [2 c# M! m4 i
----------------------------------------3 ]: @# P2 O, i5 N N8 N
whisper 我用的命令行,faster-whisper 我用的是python。
6 ]8 ]: Q4 R* Q- `, r下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:6 [; c3 E9 h! L/ [* E( C4 k
\ g0 Q5 g+ e- e3 b----------------------------------------+ o: u# R9 p8 O/ X8 z3 j( f7 \
: p% Y( J$ R7 B: y, C! jfrom faster_whisper import WhisperModel
5 g, t. ~, P: _5 {4 ?9 G$ O, P8 {) [- @! { y7 z+ j! r# x6 x
model_size = "small" \0 R! Z! k* ^* ~1 q
# F. \+ D* `2 W2 n, n! F; t' e
model = WhisperModel(model_size, device="cuda", compute_type="int8")
9 l! t4 X0 M6 z8 m! @! S- h
. L1 w1 B+ H2 W: o2 nsegments, info = model.transcribe(- i/ F9 a8 T @5 i8 a$ v& f( q
sourceFileName,
* ]+ N% m8 S: J8 h beam_size=5, " y8 H3 F, Y: u; Q
language="en",
4 x, R B6 a4 f9 }9 S task="transcribe",
* L: O9 r3 X5 n+ g8 ?6 N8 g# p word_timestamps=True,
0 ?! ]( H: T4 j0 r/ _ initial_prompt = "Hello, welcome to my lecture.")
/ w8 N+ v& q* Y4 ]: M
5 O b6 r& I& w1 A# M' K7 Cfor segment in segments:2 ~9 u. G- W% H
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
" L6 I% t6 P1 `' |% i1 b% ?. y; B. L% v0 `% Y4 ]1 s- D
for word in segment.words:
4 M( n" r. a; \ * ?0 V0 z- R. T% S. ?
----------------------------------------1 D; z, [" L2 q) Y5 |
& E2 J! `0 X; S$ f
代码说明:
5 y6 U4 r" y% l2 B' J* e1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
; o! e& D3 c% Q% ?7 b: G但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
3 G, J, T$ W- N! ]- l9 T2,segment 本身是很粗糙的,做字幕勉强能用。
5 }! c4 `' N. w3 s% L( P. s9 v* D1 o3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
; W8 ?! H4 `5 P4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
& P1 C0 c" {, I0 ?/ j$ K! y' _比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。% I1 V0 Y R9 M" Z
5,model.transcribe 中参数说明:# K- B8 H& q0 P: s
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数( D, |: K$ u2 }* z
其中
! s$ T. {! g4 P% X3 y word_timestamps=True,
- y- }, P! k' \保证了你能拿到 word,否则是拿不到的
9 Q& W/ Q2 { }3 O5 ^( l initial_prompt = "Hello, welcome to my lecture.")
# F( Q G/ y9 x" Y) _4 `1 \. T保证能尽可能准确的断句 punctuation,但是不是决定性的。
3 g2 k- R7 u: U" ?: a) v7 B% P T" [5 q其他参数可参考源文件:6 b% T3 }: ]7 n$ _( T7 h# L
https://github.com/guillaumekln/ ... isper/transcribe.py
( T0 H, Y0 {: Y' x152 def transcribe(
' ]5 J) X8 [$ }7 X& i从源文件你可以看到是支持中文的句号断句的。
- `9 _" I, s0 E( o! {8 A' Y6 K
( H) m' g) \- x% j% \! ]. i6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
; i) S7 F! X/ l! D8 J, V Y$ F% u7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。% P* v5 l5 f* q2 Q
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
7 O& U1 P; `4 I+ F3 n7 E
; j) n) q( k0 \3 l
. K5 Y/ J6 Z$ w
# M6 u5 ^) w# Z) Z9 |' E |
评分
-
查看全部评分
|