|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
$ e3 I% b! T$ G7 l; S) X9 w9 r. P% K5 d
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
6 H+ k6 }# u! G效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。5 i9 d* ~" ?$ g: i! h7 C
----------------------------------------
- S; @. v6 C% i9 K0 @ s) p显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。6 E% g/ k, {7 h8 }9 j6 q% N
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。9 X# ~! Q5 G0 W+ B' v/ v, C
----------------------------------------
5 i' W5 E/ d# a& w( Ehttps://github.com/guillaumekln/faster-whisper
, C8 u. E8 E6 C# \9 I/ H安装如下:
3 t+ r! ~( H% r9 V8 F9 u+ P f1, Windows 10% }; z4 _: `3 m" r/ X3 \# \/ K4 T
2, Python 3.10.11
/ R6 L0 x$ K6 R6 n5 \ r3, CUDA 12.1. F" u2 f$ R6 h% T v
4, 在python 3 中安装
' x7 x/ V. Q: e0 D7 ^' zpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
+ r! v/ a# w0 v# `" E' d; X这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。' ]* _& @: E6 q h7 F: Q0 G* \
5,pip install -U openai-whisper
( K1 r# l" N4 P1 q% x这是向whisper 致敬,可以不装0 j* u$ B3 [% b
6,pip install faster-whisper+ l, ]% E4 `8 ~" |( Z5 F) x
----------------------------------------: ^( |% A# F6 ~, P' |, c
whisper 我用的命令行,faster-whisper 我用的是python。
) B5 e; {9 S2 H. L. [2 D下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:- R- R) y# k: H7 J- r
, q }2 i* |. C. b" b----------------------------------------
& k( R) u+ D J1 C* X" Y* `* D' k0 \9 k6 Y7 F/ p
from faster_whisper import WhisperModel, R) ~- o) ^+ F5 ?
3 j& X$ |% L y1 fmodel_size = "small"1 Z7 @2 ?6 V+ R( X+ I7 b7 i: W9 B) G1 A
; A; y# v) B/ j9 _1 U% n2 Tmodel = WhisperModel(model_size, device="cuda", compute_type="int8")2 Y6 B* O* i5 E
5 Q' ~5 a d5 P0 }7 P
segments, info = model.transcribe(
8 u: J% q4 F* k" g sourceFileName,
6 O- M1 j9 R( B, J1 G# K beam_size=5, * o" t4 A/ W$ z3 _: i
language="en", 3 ]8 h) b, F: l9 @" e
task="transcribe",
# A* k% m5 j' K& M/ S+ R; ~ word_timestamps=True, 3 {. w0 n- r- m
initial_prompt = "Hello, welcome to my lecture.")3 ]( I. K7 B1 p+ V9 Y+ A; H
, B: d6 R: L( `2 R+ \) }* W: `
for segment in segments:
& e* B5 {' [" Y+ R/ b: ^ print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))0 a( o( C& Y6 @8 Z$ x3 o
% b$ y A& x9 _5 l# r$ B
for word in segment.words:; E$ e) ]5 u, e
0 q$ _! G1 \! J! d----------------------------------------
6 g/ |+ \$ X' K- `( W( G
& }. @/ I x0 s代码说明:: B* M$ L- {5 ^; H7 }1 F/ k
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。- Q: E! ^0 w& u7 Z7 {8 f2 g9 g
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。0 T' [3 L! l" t& b/ | {2 _" N; {! Y
2,segment 本身是很粗糙的,做字幕勉强能用。
) ^* o2 p* h% c* @) G3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
, w U% a8 I8 V4 _4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中( G3 a- w- J7 s( C
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
; u/ J. v- e& `5,model.transcribe 中参数说明:
! z4 r( z1 K$ n( ~你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
9 S2 R! r' R' v( y- K其中
- T7 n' e* J5 d: o( h7 P5 V# z word_timestamps=True,
8 X' d* M1 q( T保证了你能拿到 word,否则是拿不到的- N: h4 j o; P5 D- N
initial_prompt = "Hello, welcome to my lecture.")
. X( Q4 ~( t6 N% v8 o# x( F保证能尽可能准确的断句 punctuation,但是不是决定性的。
, r7 C8 G, t4 \7 p* L* E% h其他参数可参考源文件:
4 g3 \8 s4 p& c, a6 \( }https://github.com/guillaumekln/ ... isper/transcribe.py8 d8 j0 B, R6 n) H2 N% n
152 def transcribe(! g1 d2 l+ h: a' ?7 Q# f& S! x
从源文件你可以看到是支持中文的句号断句的。/ x" I5 T# S3 N5 f
$ c% @: ^5 `) Z) C
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
, ]9 \7 v. u7 ]* |- \4 r5 T) ]7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
% I1 S0 C& h. {3 E8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。+ J4 l/ E) R# J
. T4 }! {1 b$ F7 l( e J9 w
+ N' l6 w* M" N! i! N
; ^; {) {, ?6 m% Z) Z |
评分
-
查看全部评分
|