|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
8 J5 R/ R; k/ n0 v1 A0 b2 s' c6 K8 f# b5 r) m- a; @3 n) u
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
+ {% {9 e# @, \8 A* c" a效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
0 {; p6 w% a8 z. _# N----------------------------------------
; K4 d! D4 q0 A4 ]6 C, Z( |8 H& N显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
: m- q- o6 b' c在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。! Z" j! \7 L/ i; D# c2 ?
----------------------------------------; T a/ U9 y% H7 w% T4 K
https://github.com/guillaumekln/faster-whisper6 j; Y% ~- N* k: z; A
安装如下:
5 j9 Y& B2 f+ o9 l8 R1, Windows 10
, n0 m4 v, {, [4 R6 p; G2, Python 3.10.11! a5 b. M! c. K
3, CUDA 12.17 I3 D: n) W9 J) G* |6 E" w/ s
4, 在python 3 中安装" {9 e9 h2 Q0 X
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117% Z4 V3 ~0 w! [* L8 M
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。. k6 m! r; R6 n1 s9 ]/ [: l, I
5,pip install -U openai-whisper) N2 k( A0 j! y
这是向whisper 致敬,可以不装
4 z1 f$ S) p/ [# x, h6,pip install faster-whisper; ]6 I) K# \* n/ u9 u, m3 g
----------------------------------------
! b# I- e8 {# R% [3 ]% Rwhisper 我用的命令行,faster-whisper 我用的是python。% e( c1 A* E" [- P: f
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:. J. U0 E& O# ?% D8 J3 g5 V5 [
+ z# Y5 J- T$ E9 [' H
----------------------------------------
- Z. L/ K& `- Q- J, P3 N/ {$ }" k, l9 w8 v- X
from faster_whisper import WhisperModel$ D4 U- Q5 w1 h( R& m& k# f2 n' E
; w }6 x/ @& P
model_size = "small"4 i4 q7 ~3 A7 ]* }2 {- @
; Q3 y, _$ I6 K: pmodel = WhisperModel(model_size, device="cuda", compute_type="int8")
; h8 q3 d: d% `
5 A0 t! A/ x- z4 f* t1 t8 t: Vsegments, info = model.transcribe(
" m& H5 |" s$ U1 M% R sourceFileName,
8 G* x$ B& i8 ]) a y7 W& U beam_size=5,
$ N4 Z/ ]3 I' \0 P! u* ]( x& c language="en",
: i7 j/ z; X% z9 Z4 l+ z+ A+ n. S task="transcribe",
0 D. \ m* t- j6 _# s* {$ \ word_timestamps=True,
) s8 d% D2 x) { S, I; N9 B Y8 n initial_prompt = "Hello, welcome to my lecture.")
" [# {# M1 ^! K- N6 A3 C/ f: h: {7 D; [7 ^3 a
for segment in segments:
* T" I% a" ^( j7 H print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
! x% R. [" O/ G+ f% X& a
. b5 K4 t$ w' v( _ for word in segment.words:
6 D5 `# ^0 y) e2 P7 w
$ t9 f3 X3 `5 b----------------------------------------
$ A# p# ]; D S9 B: k5 Q) ^% @! a* O1 T
代码说明:
8 @: Y: X! }: ?3 Y* e1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
3 Z! a$ I: G1 z0 b但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
( `9 h" c3 n" @6 s2,segment 本身是很粗糙的,做字幕勉强能用。8 y2 H, w4 F8 F: ^$ h! Z
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。2 Q. S, U. i+ v, R* Y+ E
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
$ u5 U! G, N/ w; O* o+ v比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
" Z% `# G. U6 u, c) I3 _5,model.transcribe 中参数说明:
! p9 O2 J' A( }. o9 M你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
+ F! y; R, f$ U- W1 Z其中
. a- N1 C, {1 ^2 |3 K$ P0 } word_timestamps=True, 0 _9 J1 T1 h1 P5 S
保证了你能拿到 word,否则是拿不到的
8 y3 L6 e; |( N3 P. C- g. ?5 z initial_prompt = "Hello, welcome to my lecture.")
5 s* r- h7 I7 S$ t3 n: g, O. _: f保证能尽可能准确的断句 punctuation,但是不是决定性的。, u# u6 [4 ^/ U/ y' Q; k3 D
其他参数可参考源文件:
" H5 t h. X+ q% Xhttps://github.com/guillaumekln/ ... isper/transcribe.py
9 k# O6 U: L( e152 def transcribe($ _3 K9 b! C- `" j& H C; G
从源文件你可以看到是支持中文的句号断句的。
' L3 S% @% [& A* Z" |. V7 W2 \+ U6 I
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
: j; O% d4 s v7 n2 i/ }1 g7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
# O- F9 b, h2 Q) y; k- {8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。3 j1 B: ?' k0 `3 ^' V
2 u0 V1 f: {/ B) C
& L) U% u7 X' d3 l5 k+ W5 x2 I* u+ p, h
|
评分
-
查看全部评分
|