|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 7 c; V; }% D e
- `& r7 Q( I$ j
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。! P" S4 S8 O$ b2 a3 X+ e
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。; n/ w: I4 g7 N" R5 d$ j
----------------------------------------, R6 B1 |! f$ |9 g7 M# q
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
# O7 m" r @, E; k( I: w4 g! ^在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。$ ^) Q, G8 V$ o' |0 p0 H2 `
----------------------------------------
- f9 K5 @2 B$ G+ Y7 W/ khttps://github.com/guillaumekln/faster-whisper
( E* {; a, d' R. N% y. J- V" _安装如下:1 U( {# L. c: x
1, Windows 10
4 ^0 a$ ?9 c( Q; t* c" G8 j2, Python 3.10.112 @2 K, z; v' K7 A$ ]8 ?4 `2 E
3, CUDA 12.1
2 s7 _6 |8 Y& p( f+ ]- U0 M& P6 j4, 在python 3 中安装" {2 D8 m9 l9 \: f5 H: n' ?
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
$ k; z# Q4 Y7 u2 `$ q8 N/ W这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。( j3 a6 ]* t: |2 `$ Z" \
5,pip install -U openai-whisper
# {4 l( u& E0 O, j. `- Y* E4 l这是向whisper 致敬,可以不装& ]2 U. X) V# I7 u. o/ J1 |
6,pip install faster-whisper" n' d5 ^7 ^/ a5 k5 C/ f) I: A: R
----------------------------------------
5 K$ `+ X f! X, E Awhisper 我用的命令行,faster-whisper 我用的是python。9 Y) Y# Z* b% K C$ Z8 @; h
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
5 v. F) c5 c$ ~ c8 u! C( I
% W/ E. b: A* ]- i+ I" `----------------------------------------7 g' D( d7 c% H" m2 [; m1 f
, k4 e% a7 Q! z% O( [4 E3 ]from faster_whisper import WhisperModel. f0 }* Y/ \/ K$ i* j+ n/ ~0 f
2 A5 @; y, \0 o3 j X
model_size = "small"3 a! }. x, R9 h7 V9 T0 p1 c' ^
1 k: t U$ Y9 S( u. H9 e
model = WhisperModel(model_size, device="cuda", compute_type="int8")9 g* Q8 Q B3 u, U
; v# _0 G* K; h& _4 p+ h
segments, info = model.transcribe(% u. @, l, e' ^. ^5 P
sourceFileName,
: x; y9 S0 l4 A: j2 S( S y. i+ M beam_size=5, * L9 G8 B' S, Y7 P! y
language="en", - x6 k0 y% O& ?8 e7 r+ d
task="transcribe", 2 k8 O' g5 T" @+ B2 o
word_timestamps=True,
, j4 E# M0 U2 @; W9 u initial_prompt = "Hello, welcome to my lecture.")
k) c2 |& v8 w2 m3 [% Y9 R
: n2 k. G. B' c8 L2 W, ]8 U- {for segment in segments:) P; H) j( v; N, q9 c, C
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
5 }9 h: G! `! n$ n# ^6 ^
9 D0 z p5 E2 s) A5 v. M4 S1 a for word in segment.words:
% u8 q5 Z' B" \" C4 E6 P
I+ f. G# x5 J, V----------------------------------------
+ A. @0 G" |5 p3 g. o7 _- w/ z- v9 e
* v7 c8 X' B% _代码说明:
# S+ p9 V; y. o8 L+ e; e$ ]9 Q" ^, {1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
4 ^* m& X5 K# z3 k: I3 T但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。. t7 _6 R( z4 o& `- w* ~7 x+ ^" ^
2,segment 本身是很粗糙的,做字幕勉强能用。2 {4 }) i$ s% v6 L" [% a! h# d
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。2 \% M# O/ S: @+ ?: v5 y. z' H
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
( B- ^- j- Q/ F: O t9 w Y比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。 w2 c0 ~9 y O3 Y
5,model.transcribe 中参数说明:: Z& H7 k7 ^# }
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
; W5 c- [& A; c, v+ l. \$ o其中* |* |6 d/ q; b; [) f: @- K% G4 x
word_timestamps=True,
, `& F, j) Q) B7 T2 d# Q0 ?保证了你能拿到 word,否则是拿不到的
" [ Q+ @4 H% m6 m9 q! b T1 k8 a initial_prompt = "Hello, welcome to my lecture.")
7 L/ t/ x K; L$ u保证能尽可能准确的断句 punctuation,但是不是决定性的。1 H# A2 U: A9 a
其他参数可参考源文件:
# o3 R* A( `+ _8 zhttps://github.com/guillaumekln/ ... isper/transcribe.py4 q5 s+ [& f6 i4 H0 L
152 def transcribe(% U3 S* p2 d8 L5 H- ?) m6 q; F7 C
从源文件你可以看到是支持中文的句号断句的。
; S- r2 P0 O7 k P z) e$ ^, v5 |8 v' F, m9 r* f( Z
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
* j1 P& r4 t$ y5 \) p8 e( Z7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。1 D# D# k5 R$ B" @5 U& c" C' V( {
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。( C8 _1 a* N) @* K2 ?5 ]# S
7 f# O' U4 o- U4 Y
) N+ Q- V' b6 ]6 A* Z8 {
9 ]) z1 X+ h3 u1 g& O
|
评分
-
查看全部评分
|