' T Q+ B5 n1 Z: @. x0 ~2 f2 C; {6 N为了配合whisper语音识别,需要将mp3,wav,mp4等格式转换为其所需要的
" J3 t% d% k/ n) g, F& M& \2 YsampleRate为16000的格式。' `) C! C3 ]+ M3 ?- d$ d$ M: l! m6 @
本工具为命令行工具,根据命令提示輸入源文件和目标文件的目录。
+ S! D) R, f2 R: {/ w执行后,会在目标目录生成和源文件相同目录结构的wave文件,
/ L$ t' S* y9 S3 k, d1 S( U d供语音识别之用。
2 S- i$ q/ D+ @1 d. F1 a+ B' G& X7 d! }. B$ E6 |
本工具需要配合ffmpeg64.exe,Processing.NDI.Lib.x64.dll,3 T. v, X* Y# | l. d
可以从以下软件中获得。
: F* U- R; u9 w/ U& }9 n# Uhttps://softaro.net/ffmpeggui/6 a0 K, A8 o* n( `: n
2 V0 k" c5 i) i+ x u工具代码如下,vs2022编译即可0 f1 }5 t; \. t a2 \3 i+ n
- using System;: S, v% M! d$ R. Y, O( C+ j
- using System.Diagnostics;; U) N" J8 L# h2 H. i
- using System.IO;4 ^* j5 e: {9 z0 ]; y
- 8 ~$ Y: v& Z; k
- class Program# c2 T0 I9 F: p" ^8 t) _* z; I
- {
( L$ k, @9 D* b/ L6 V! a0 G - static void Main(string[] args)
% @, C |9 t% L - { z# D6 N( F/ c6 Q; Q0 P
- Console.WriteLine("cvtWave");
& u8 ^8 T0 O0 L4 ~ - Console.WriteLine("请输入源文件夹路径 (folder1):");
. {& j8 [3 S! P! A. C2 p! e- n0 f - string sourceFolder = Console.ReadLine();. w8 E; K6 H3 w
- Console.WriteLine("请输入目标文件夹路径 (folder2):");3 K% O3 E. N- O& N7 X
- string destinationFolder = Console.ReadLine();1 q) J) ?$ Y* }
- ; N d' e( w3 D, O+ S$ t: e
- ConvertFilesToWAV(sourceFolder, destinationFolder);
% I5 | D5 |/ |- |6 \: ^% Q5 S1 C7 s
" R' d! U- j$ K1 `8 I2 ?- Console.WriteLine("转换完成.");( f* s# t( K7 T3 ^
- }& m/ b/ S+ [0 g* e
, K" O) |2 d1 b$ e8 X+ m- static void ConvertFilesToWAV(string sourceFolder, string destinationFolder)( m/ Z: k8 E( J A$ O5 ^
- {! W* G/ @ K$ n8 K! j$ ]
- foreach (var sourceFilePath in Directory.GetFiles(sourceFolder, "*.*", SearchOption.AllDirectories))# G" a$ W* e. r9 G2 u1 v; s
- {8 K% b0 e( i) j2 l! F- L% w1 E( G
- string extension = Path.GetExtension(sourceFilePath).ToLower();- L5 L- p2 v1 d+ N+ u
- . L- o7 e# x& T8 V) t/ G
- if (extension == ".mp4" || extension == ".avi" || extension == ".mp3")! @. y0 J' w& S4 R) }
- {0 G- O4 j- c9 M% t. c1 }
- string relativePath = Path.GetRelativePath(sourceFolder, sourceFilePath);
0 D; a9 m% v! l8 w4 a - string destinationFilePath = Path.Combine(destinationFolder, relativePath);) L# `2 G& w% ]! d+ w7 O: |3 g: [
- destinationFilePath = Path.ChangeExtension(destinationFilePath, ".wav");
Q3 B N* y. E% A+ B3 U
& ~6 p0 P1 x1 [3 y8 \) |8 e% J0 f- Directory.CreateDirectory(Path.GetDirectoryName(destinationFilePath));+ L$ N6 Q/ d# K7 g0 ~5 w' ]
- 2 i1 J8 g: R1 o
- string ffmpegArgs = $"-i \"{sourceFilePath}\" -f wav -vn -b:a 256K -ar 16000 -y \"{destinationFilePath}\"";
& P5 i# P+ O# I1 O2 b' ~/ j7 [ - 6 ?. K. o1 I' O/ l2 Y5 w- l K0 u
- Process ffmpegProcess = new Process
7 z& i4 }1 {+ ?# P. Z - {# F% e- c$ j( R" f) g7 ]7 r/ w
- StartInfo = new ProcessStartInfo$ O+ F; n8 k4 n' z
- {: s/ I& d: ^# F( y
- FileName = "ffmpeg64.exe",) W' l$ X( v7 `7 w* C$ \( \- m
- Arguments = ffmpegArgs," i# `3 @7 }( @; W2 E
- UseShellExecute = false,
# D5 g7 Q; y6 E8 Z" @& v" X: ? - RedirectStandardError = true,) l" _( y# j% S: ~* S. h9 |7 H9 m
- CreateNoWindow = true
5 w3 h+ i4 C p0 m - }# @5 E y# Q2 h; ?. }# `% ]
- };' O( N% z5 q6 U9 V8 F
0 U8 a" A) E \/ H: p- ffmpegProcess.Start();. I% d) B4 O( ]0 n. x1 `
; Y: ~, W. D( l4 i1 j# R- while (!ffmpegProcess.StandardError.EndOfStream)2 u+ h( h1 u! Q" F
- {( i! ~ M& N7 \( {6 [% h
- string line = ffmpegProcess.StandardError.ReadLine();
% H" s3 }1 |- ~. f2 \ - Console.WriteLine(line);; N- |- o0 x- v. L
- }
* o. ]2 @) \: w; m+ L9 V* s/ g- ]7 u - % t- x" K. f# o7 W8 J5 \
- ffmpegProcess.WaitForExit();
6 d/ x* l6 X- A3 w0 x2 B - }
5 Q9 r n4 r% l+ [ - }3 B: G! a. O5 ~
- }
7 e9 Z" C1 V1 c r - }
3 y2 G; [ [' k* B. ^
复制代码 * o9 ~! C2 c0 W/ r5 B& N" B% j4 N
) U! q0 [/ M( W
7 G2 K- s$ }, h* O q3 F& p9 c/ U
|