|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 , E0 k8 R) ~2 ?& C0 D( O' W6 O2 Z: y
2 \9 N" X$ c) {) m借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
* m% y; B$ a* p# G& h9 p效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。- w" T- G5 p' f: [# k
----------------------------------------
a) J, W1 x2 U显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。7 |5 E* P+ x8 y* T+ c* m
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。1 s- ?* Z0 F8 a+ ^. O9 O5 G
----------------------------------------
( W, @# m0 `% h" K9 ?https://github.com/guillaumekln/faster-whisper
& w2 S/ N, E5 }: D4 E+ r安装如下:
- R) v/ \3 v, Y" O8 v e. r {& T6 E1, Windows 10& ]2 |* w+ d/ S
2, Python 3.10.11
* H t" B! f" B$ H3, CUDA 12.1- K# [. l; _9 W/ K, h8 u
4, 在python 3 中安装
* L, ^/ u/ E3 f# \2 xpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117- i$ V) |, e* y+ x, G/ [
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。) n3 L! a9 x3 n
5,pip install -U openai-whisper
! |9 m* r: e4 p, @. ?* a2 k2 E这是向whisper 致敬,可以不装
7 w) b4 @" R, X- P2 a ?6,pip install faster-whisper$ j/ H5 B; r2 }0 y( P2 j
----------------------------------------% K- X" M. {; Q2 G7 V
whisper 我用的命令行,faster-whisper 我用的是python。
4 r0 k1 @5 }5 n- \2 G' I下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
% z( j3 h' P0 e# C% i; k$ j! j7 i$ q/ ]4 y" _
----------------------------------------1 l6 ?. P/ `, i+ a! `( g$ @# r ^
1 N' f, _3 h, P9 ?$ N8 t$ cfrom faster_whisper import WhisperModel
' ~5 T6 x4 {" m" S5 g& j, s8 f& U" x! D4 h
model_size = "small"
7 t1 K2 V; G2 W' s: ?. l0 @4 F( a4 _4 r# T+ }5 p
model = WhisperModel(model_size, device="cuda", compute_type="int8")& C. |7 M0 M, Y/ Q9 F4 S# |
) y/ K: a% z% a8 m9 f
segments, info = model.transcribe(2 Z& T3 d) M) [# G) P' x
sourceFileName, . m$ F5 o- C$ M/ J7 D$ u
beam_size=5,
+ q" c0 p' D( [9 n; i) o4 D$ l, S' U* r language="en",
8 j, ?4 K; D" u Y/ S' P9 @ task="transcribe",
& r) \7 |5 I% K word_timestamps=True,
1 M3 O \ o' Z# | initial_prompt = "Hello, welcome to my lecture.")
( ^- d7 _6 |) S: p2 T
5 @: L0 A& s1 H$ [for segment in segments:& P" k1 [7 d# W/ f
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
, F/ u! k8 @( V1 H8 I$ Z0 I, N* f6 o$ k! f8 @
for word in segment.words:
; z+ o8 ^- M" m" ]2 r
9 b( k. I( U p6 n( z----------------------------------------8 h2 x9 z. D' L+ P" [
% B3 B" _4 S. n代码说明:1 o9 Z/ ^2 a# E+ t9 R$ ?
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。 {5 N3 O ^# d4 ^
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。. q. t8 d3 C5 Y% |4 F. ]
2,segment 本身是很粗糙的,做字幕勉强能用。
% u, d& J8 T0 G' W1 f3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
1 X: H) G; I/ |4 I4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中$ h1 o5 a* {& [, i3 f) E* }* z7 x
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
2 k) C. e8 t! F) J5,model.transcribe 中参数说明:
4 ~; A! \; H5 w4 R你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数% F% b! a: q9 W. g* `3 s. t, {4 z
其中
9 u7 i/ N3 H: Q) n/ X" g, Q word_timestamps=True,
+ P9 S: ?% @# G3 F4 \3 E0 v保证了你能拿到 word,否则是拿不到的
: P- A, G0 g3 M6 N' X initial_prompt = "Hello, welcome to my lecture.")
3 t! u3 f- i/ d) J5 }! p$ ~保证能尽可能准确的断句 punctuation,但是不是决定性的。
2 c( k! ?5 y* d3 v2 o; Y5 b其他参数可参考源文件:1 b8 l3 V0 ~6 X' R+ N9 ~* d L
https://github.com/guillaumekln/ ... isper/transcribe.py+ i/ x2 _" Z2 d8 Z2 l
152 def transcribe(
2 g6 \6 B' V0 ~! f' L从源文件你可以看到是支持中文的句号断句的。
2 [6 Y0 y, |) `6 Q5 a
3 r' h( @! Z7 g- ?6 n) B2 |8 @6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
$ S( S) a5 h7 o, _9 z, T. M7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。% ]2 u4 P* j! Y I
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。2 i6 s9 S2 O; w" K! M6 ~8 t
7 `7 x" h& n L2 C
6 i3 N% S% H" H
* B0 C- C0 j2 L. W' e& e8 K! `3 { |
评分
-
查看全部评分
|