|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
/ N, a8 x! c$ W0 i3 T. _
. p( n0 J _0 L; M借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
1 w, o: t( r% i效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
]3 v; l3 e/ f7 H! e----------------------------------------' s0 l: p! A" [
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。% F5 \3 E. x8 o6 X& p0 Q
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。9 n: Y \" R9 o- S; F) Q
----------------------------------------
4 z" g9 x- C2 y; L+ vhttps://github.com/guillaumekln/faster-whisper
5 _% S( N4 m3 L安装如下:& t/ t0 u; n! P3 V
1, Windows 10
$ I; T2 x( V- G2, Python 3.10.11. V5 l" B7 o) b" S: J
3, CUDA 12.1
F L3 ]2 w: P. R. e/ O+ w4, 在python 3 中安装& J; m. V" @; p* r+ S d* H% q
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
" \3 X, ~2 e- ]7 ` z2 \这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。, x. k- x9 B; P- b b
5,pip install -U openai-whisper) j0 {: M: K; K% U4 J
这是向whisper 致敬,可以不装3 o, j9 X( v& c8 E5 L4 }7 r7 p! U
6,pip install faster-whisper
5 G1 x. V- o1 g----------------------------------------/ ^9 v" v1 J5 g+ Q
whisper 我用的命令行,faster-whisper 我用的是python。7 ]! ?4 |' W' S+ X- v
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:$ g/ t, K. x' ^! ^4 O) s
* V. v" U9 P) F" P! M. e- m; J$ Y
----------------------------------------2 ^# Y1 O3 u/ Q. F5 r
) n4 J; Y/ S3 z1 {% P" G
from faster_whisper import WhisperModel
) T; E F+ _* P) ~. O
/ H7 i/ i- b) [model_size = "small"3 Z2 j- X l1 e4 \6 b
& x+ ]$ Y+ d* q M& I5 k/ }0 s
model = WhisperModel(model_size, device="cuda", compute_type="int8")' J" U& |% d G+ L
, J9 o1 t. I3 c. V/ \
segments, info = model.transcribe(
" A/ z# ~3 ?4 ]# C sourceFileName,
4 D0 g6 @: Y4 e beam_size=5,
U& u0 a6 _8 t/ }; I& F$ o5 c3 I language="en", ! t i# [- [& K/ q
task="transcribe",
, A& a8 R; X6 z6 G4 k6 V+ { T word_timestamps=True, ' |( C. x* b6 x# `* ?
initial_prompt = "Hello, welcome to my lecture.")
) a% {2 Z# O4 o$ r3 i+ ^/ E) ]# E) d6 p* X
for segment in segments:
" o5 |3 _, y9 T2 m+ i print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))3 e2 K5 Z( t+ `2 c/ G w
5 D5 |3 Q6 y5 ^3 Y! Y for word in segment.words:
& v' r6 w5 e+ l0 x$ Q! u
1 \$ }. r( ?/ ]' n: @$ r----------------------------------------: J9 D( `8 V: d: U- U
2 _* }( J) J; \* s6 e# \8 `代码说明:2 @+ U, m' S* Y- v# ]0 c8 l5 |8 F
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。! ? {- l1 |- i
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
+ l& m4 B* I- y. D2,segment 本身是很粗糙的,做字幕勉强能用。) f3 N z, I% `3 R( t
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。/ {2 A: j0 j5 @+ ?
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
( Q1 k& r& c, _0 C. p6 F' [比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
9 b% [* m( R s. I/ Y5,model.transcribe 中参数说明:2 O- I' ~8 j4 e8 s( ?! ^
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
' Y5 f3 x0 j) y' `* N I H& A) g其中
( U" P u0 n7 p4 Q: F- {; S word_timestamps=True, / t: k( |, |: `
保证了你能拿到 word,否则是拿不到的
- V6 y$ M; t" T$ M initial_prompt = "Hello, welcome to my lecture.")# V7 Y1 F: G6 [) E( ]1 A' d5 [9 Z3 j
保证能尽可能准确的断句 punctuation,但是不是决定性的。
. g& ?7 Y1 l- R9 |3 X" J1 D2 Q其他参数可参考源文件:+ j' e$ V) P- b& o8 Q: v
https://github.com/guillaumekln/ ... isper/transcribe.py
" L6 \# ~- H8 F8 }4 n152 def transcribe(
6 h) H5 a5 ?" _8 Z从源文件你可以看到是支持中文的句号断句的。+ B& Q- D" B/ O2 E4 J
. U, e3 ]0 M+ n* [
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
. J0 A' x/ I5 g7 H: q, q# x7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
8 U4 O8 ^4 `2 B6 E2 S+ ?8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。: K/ Y Q0 L+ v& t3 f1 y
! ]5 p7 G( M, @2 s* ^3 F" a
2 d+ l$ Z1 I* f
4 I, W! I* M; K2 ` |
评分
-
查看全部评分
|