|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 7 P8 R' v/ o& |
4 r$ r4 P4 u5 Z5 h- _借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。/ k. e) z R; N. F$ |# A
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
T; q* R! V- p) d" W# x( D----------------------------------------( `% X# E" F9 ?& R7 \( }
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
& b- c! [# u% l1 g1 g+ u4 r在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
# L$ [1 S2 Z4 o# _/ g1 r# k) D/ {----------------------------------------! z# i8 n; D! n
https://github.com/guillaumekln/faster-whisper* K/ v3 U4 v; U) w# l0 M7 l
安装如下:3 ^8 { r" t6 X4 e/ r6 h
1, Windows 10
' }* S# L' a6 ?$ c) w b$ D! J2, Python 3.10.11
- V2 N0 T# F1 W7 f2 O3, CUDA 12.15 ?3 n2 y4 d1 I; q* n
4, 在python 3 中安装
; P/ ]- d! U: U6 r; z' ?0 ypip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
& C. P( | n, g J, Y- {这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。* q3 ^$ p) [' [/ t
5,pip install -U openai-whisper
2 _* b. F8 o5 j( p5 S; R- e这是向whisper 致敬,可以不装
; `; i# |, Y& O) z( S4 N6,pip install faster-whisper
# R6 m2 C8 n0 I4 b( N7 V8 W----------------------------------------0 L) u V h- J8 q4 t: }% M; o0 ?
whisper 我用的命令行,faster-whisper 我用的是python。# M1 i: m9 E p* V# B8 | D
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
, [: D/ e- B# d$ j3 Z$ m' ?9 u
# F7 D8 l/ O9 j& x1 b----------------------------------------. b! k# ?$ E: v3 e. L
6 S8 q' |* Q' n& \- G
from faster_whisper import WhisperModel
; V: F) _6 c" z: C# Z+ t; `6 Z7 O a' g9 g6 K; F
model_size = "small"
" J& v5 A; j% ^2 L/ z y# a9 o9 q
1 ?# k3 P8 m: }- }% |# kmodel = WhisperModel(model_size, device="cuda", compute_type="int8")
" h/ `/ S( {) Y% M% E9 G- Z9 I, Z& `8 ?0 F9 C2 A/ r
segments, info = model.transcribe(- [& | z1 i1 |& ]& \
sourceFileName,
. A6 Q" {& Y A H3 r beam_size=5, ! r/ E# e B) \4 `9 w/ ~
language="en",
7 `' d! }+ a/ |3 }. L" X: _' c task="transcribe",
2 i( k2 K( J N+ g; @% b word_timestamps=True, ( ~3 N1 ^$ ~, N
initial_prompt = "Hello, welcome to my lecture.")3 } ~8 A' w( L$ i* c/ W+ T
/ x5 n7 Z% r3 H* X7 O, e# x' \( [. Dfor segment in segments:! `. G) l9 B( _2 ]
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text)): s" j! Y6 R- o" x% K+ |
( X/ u4 L$ W5 M. j7 I
for word in segment.words:
5 ? R( ]- ~. r! d6 u% ]* m. [
* a4 _, B; c! x! E# e' b4 d: e" u----------------------------------------
' {& @6 b4 \5 L* c; \8 Z# m
8 g4 k* G6 Z0 [代码说明:
+ {# o/ W: z7 A6 o9 m- E7 g$ f1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
; E) \9 _- }9 c! K/ |但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
, K# K0 \; f) Z# m+ d9 f5 O2,segment 本身是很粗糙的,做字幕勉强能用。( _" N' }. U2 w
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。/ ^. M) ~' E3 j- R8 A
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中; k% i" ]- [9 o! ?6 b2 }
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
/ T0 }1 Y& B: ~5,model.transcribe 中参数说明:6 I! c; `2 O4 ]6 I- b! s7 O/ y( I
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
# g7 \ Q- @, Z- f+ O/ p. c( |2 V其中7 e2 p" l5 ~" I6 v( A/ b
word_timestamps=True,
0 w2 D+ e- T7 y) Y- g" D; n! B* e保证了你能拿到 word,否则是拿不到的7 Q9 f9 N* n$ D. Z1 H
initial_prompt = "Hello, welcome to my lecture.")
' T4 `6 b2 X1 f4 J# M4 q; m* p+ ^保证能尽可能准确的断句 punctuation,但是不是决定性的。3 [. Q0 \: ^/ r* v* k8 p
其他参数可参考源文件:
7 c9 [8 {3 B; _/ y1 b3 |, D; ]https://github.com/guillaumekln/ ... isper/transcribe.py7 B7 D' |* a3 C$ `
152 def transcribe(
- h% l& r% U6 n) ]- i# |, M从源文件你可以看到是支持中文的句号断句的。+ r" I* @/ a3 l/ f* V9 Z. f( K: n
* g w6 X: A5 N7 [3 ?: C# ]
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。) V/ W7 M' k% J5 h" @* ^
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
2 u8 M# X/ i. c; Y1 U8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。8 A; k) L9 I# p9 c; l
' q* e8 y4 z, T4 F) t2 j* Y ) n0 t( |, R. X% ]8 s9 e
" x$ k2 k r) ^/ @: [, |0 Q, e |
评分
-
查看全部评分
|