|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 " ^$ u1 w& ^+ I& b* x1 ?2 s
3 X0 I& v) S/ _; I
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。1 s. O% P' p* Q- A( {
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。) W5 m' I& l* \2 j; z; ?1 ?# [
----------------------------------------
3 z. B5 m! E5 G; D; c显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
* p- f8 O% b$ R: D ^! @在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
J4 A/ q; e$ F3 j( D----------------------------------------
: j+ j5 U" o+ Ghttps://github.com/guillaumekln/faster-whisper# f: }$ p; Q' w* l) x( i
安装如下:6 y) ^" G* E- Y2 n$ Q' c) E
1, Windows 10
+ R6 z7 E4 |9 O0 @6 e2, Python 3.10.11
" B/ ~. ^4 t5 i3, CUDA 12.18 {- C4 X0 b* @+ f) G
4, 在python 3 中安装
& R3 ~0 e2 _* |' ^/ G0 _/ _3 L- Rpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu1170 f9 j% j3 b" R" Y' X
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
7 J3 s8 x- L. B! I5,pip install -U openai-whisper& q. `4 e+ s+ n0 B0 w
这是向whisper 致敬,可以不装; @ o6 |6 j6 z3 \! A/ ^
6,pip install faster-whisper( C# Y: R1 p' C2 H
----------------------------------------
1 s; N; k; `9 r! W* Rwhisper 我用的命令行,faster-whisper 我用的是python。/ ?! k! D8 r) p6 q0 C
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:0 i; J/ Z! C& z$ Z h. ]
5 d7 X3 L" A/ p+ ?& Q K
----------------------------------------
7 C( k, V6 e6 E- D" w) d6 H6 W
7 N6 B W# v2 afrom faster_whisper import WhisperModel$ e- ?4 m0 {3 A( ?/ q
% v# T$ Q8 ]6 U& u
model_size = "small"
9 C2 Z& q! t9 R5 }% j
" {" k8 w) r( \+ R7 b; }6 l: _) Nmodel = WhisperModel(model_size, device="cuda", compute_type="int8")
: _0 D- X) d2 J) z
! T7 E+ C1 E5 s0 F; f, B* B* T3 @segments, info = model.transcribe(. q- d* L- W4 b) f9 q7 [
sourceFileName,
* Z1 i1 q Z K% t' Q beam_size=5, & i0 l9 t( C" f7 O* R' J
language="en", * S5 J9 K& f1 ^8 k2 ]' w
task="transcribe", ; I3 e; J0 s# S" L0 Z" h
word_timestamps=True,
6 n' d& X+ N8 P$ ~$ E initial_prompt = "Hello, welcome to my lecture.")5 t0 n, N4 Y6 O/ Z
# P9 O2 n$ b+ k+ t0 [
for segment in segments:
; j; p6 c. x9 U" ? print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))7 Q9 m+ Q3 p. V; ~/ E
1 W4 A0 `' V! S
for word in segment.words:
: E' t% L* Z& O! Q3 M: t
! Y' k5 `* X' D/ ?& [+ ]1 C----------------------------------------$ u& Q5 Y: l' j! ~
5 k! i4 \2 e6 `+ g% K, X+ M代码说明:: `5 \9 Q# {" B7 ^0 w0 _# R
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。& b9 q9 \/ |# \
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
5 V* L4 s0 M0 N. E0 U2,segment 本身是很粗糙的,做字幕勉强能用。4 J6 t% o$ L2 j* |
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。8 x' @2 c5 t2 R: r" i$ h! o
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
& I3 @% I7 N' S4 `" V% d! |比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。7 i2 Y& e. t7 Q5 Z
5,model.transcribe 中参数说明:
- g ?5 w3 {4 m. z6 [你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数& \$ [& }+ p$ Z9 P9 e
其中
. p7 h! x: N( |; @3 S9 \: e* n word_timestamps=True,
4 O( u1 q! Q, X `( G* v保证了你能拿到 word,否则是拿不到的: E( b6 y; `$ z' d: _5 F
initial_prompt = "Hello, welcome to my lecture.")' i6 h( v8 z7 z* n9 s' R+ F
保证能尽可能准确的断句 punctuation,但是不是决定性的。
5 O/ O7 v G p0 m( P5 L) u其他参数可参考源文件:2 t5 H0 W$ Y$ f6 a- k% x: B9 r
https://github.com/guillaumekln/ ... isper/transcribe.py
# ?4 e* E2 p, H4 P6 @152 def transcribe(% @4 d2 v$ b. ?( ~, z
从源文件你可以看到是支持中文的句号断句的。0 d6 _% e3 |: C4 ^! W6 ]& s3 [
% J# ]) [, Y$ I( ]/ c3 V3 b
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
! i$ K B- r6 a9 x* T- x3 R5 h7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。4 c& V1 |( T# z* S- `
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。/ \) r: j' j1 ]" l
) u7 r" q0 m7 e% L
) n& s8 w8 g4 I5 \' y+ |
) H* u: r, ^; Z% W" T |
评分
-
查看全部评分
|