|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 0 P5 S5 N) U. N4 Q- `
+ O- X" ?7 N& l借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
* G- I) [7 n) C( f4 P. c效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
: F* Y+ ~; R" t# i3 q----------------------------------------) E) [7 E) N0 _4 o7 m& }$ N
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
5 Y2 l3 G: O. s, |* h在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
2 X H0 u' a+ O+ Z, v# e; j----------------------------------------
- H b# R1 s: q" F# Lhttps://github.com/guillaumekln/faster-whisper
- \: Z- G- G+ W" ]8 ?. w T! N" h6 k安装如下:
, A7 g0 [8 ], H+ o% ~2 N) L% Y1, Windows 10
& c3 `! d, [; U5 W5 d" [2, Python 3.10.11- p6 d- N4 w6 u# Y* H7 Z+ r8 n% S
3, CUDA 12.1
2 T( Q5 g3 ?! Z% a4, 在python 3 中安装
1 ]9 p' N$ L* k4 k; Npip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu1177 J4 H; V/ W5 O6 o ?* o, N( J& }
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
+ I: E7 L' L* z' U. @1 t, x0 o5,pip install -U openai-whisper
0 g( q5 l! w- r7 V0 L; [/ r8 S这是向whisper 致敬,可以不装 i& X5 E% \3 I. E! U1 Z6 r& W
6,pip install faster-whisper, M. ?6 A) S4 G# `
----------------------------------------6 |4 a" z- {1 y/ {
whisper 我用的命令行,faster-whisper 我用的是python。
: E( T4 Q2 p/ h" V% G7 S下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
; D( [$ i# Z1 e. L+ i$ b0 Q+ U! p2 |/ P; c* _" g
----------------------------------------0 ]* z/ a2 W4 @1 {: j5 Q& [' c
7 E* S6 a8 z, S
from faster_whisper import WhisperModel' h4 |! [4 |7 Q* J5 l; R6 [3 l
( [) x* t* Y$ C9 s) E2 f
model_size = "small"5 i* e3 h% Z+ S! s/ w
' u1 |' e4 [7 D9 ?1 w! b* x
model = WhisperModel(model_size, device="cuda", compute_type="int8"); `! i% L F r) s' s2 r1 p
( R. T7 \) w8 w) J1 vsegments, info = model.transcribe(1 ?: C! r' }5 C/ }
sourceFileName, 2 z% R) t9 F3 O ]4 b
beam_size=5,
! b: Y6 }6 P; C2 P' |% O9 R language="en", 9 E6 m Y/ D x! _; W
task="transcribe",
2 O; A: i# D* ~5 k- y word_timestamps=True, , m1 U$ j5 R7 f
initial_prompt = "Hello, welcome to my lecture.")3 g' q( R$ d* _* R: y0 p g% V" k
& a. {8 Z2 m3 kfor segment in segments:8 }* r' a1 y5 d
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
2 Z: R. O; x, a
8 A8 f" h- D( {. |- }: U) |" H for word in segment.words:. p0 B2 f- L! ?
1 ~% `6 Z; Z: z( u----------------------------------------
3 |. J: b/ a8 l S, ?9 E9 F- M. o9 A! A" J$ }
代码说明:
/ p0 s8 W8 Q1 o1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。& `+ D r9 Y* J& r& U
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
( K" T5 {; x3 S7 ~0 s' D6 K2,segment 本身是很粗糙的,做字幕勉强能用。
$ h, P. N7 M5 b8 ?; ]3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
" p) Z6 P& a( y% L) P+ D( ]6 q4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
, m* K6 x1 u2 T; X$ V4 \比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。9 n, H8 r* j" T
5,model.transcribe 中参数说明:
4 w, x1 L4 T+ {6 f0 `+ _你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数) \: A* z, e9 a/ O, [
其中
) J- ~$ ~! i4 n/ B! X% }/ ~6 @ word_timestamps=True, 4 L0 ]0 A* e3 |5 x' X8 J6 b5 Q0 x
保证了你能拿到 word,否则是拿不到的
& _0 x+ K7 |* b# J" I& F initial_prompt = "Hello, welcome to my lecture.") V9 V! s6 L/ s# D e% g5 V
保证能尽可能准确的断句 punctuation,但是不是决定性的。
+ W( \0 O& c* n! J其他参数可参考源文件:2 s( u( L( I$ }/ B
https://github.com/guillaumekln/ ... isper/transcribe.py
- }" w# D& v0 b# b m! f( G; h% }152 def transcribe(
, e8 a) i: c0 [从源文件你可以看到是支持中文的句号断句的。
9 n/ f# T: O6 E! J5 z* q' i4 G g
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。. j. V" s# [: i5 \1 S h; o
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
9 I8 B* Z- g3 b7 N0 s8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
- H8 m4 }0 y, ?" k; X, H6 v( l# D5 E+ x* A! L) y
- j B6 b4 q9 ]- V5 b$ d7 _
3 J' n+ ]6 w2 `2 X, ^ |
评分
-
查看全部评分
|