1 \$ s) s; n# `$ v9 I5 P+ i为了配合whisper语音识别,需要将mp3,wav,mp4等格式转换为其所需要的
$ O* ?$ Y7 j& D% S2 @0 w# N- P& c6 S' M# JsampleRate为16000的格式。7 A4 l! f& z- T; W
本工具为命令行工具,根据命令提示輸入源文件和目标文件的目录。) X# t& X3 e( d
执行后,会在目标目录生成和源文件相同目录结构的wave文件,
; K7 h/ @5 H3 R3 V8 |* Y6 s供语音识别之用。# L) K; X' W9 Z) w
: L* E+ C! J; ^: V
本工具需要配合ffmpeg64.exe,Processing.NDI.Lib.x64.dll,5 B* U. a; Q' T5 c
可以从以下软件中获得。0 U k* d! M( ?! u
https://softaro.net/ffmpeggui/
5 m) H$ T5 v' B: H. `2 e0 T4 k% s1 g7 c" O
工具代码如下,vs2022编译即可% j3 {3 Z; v: G' H0 b: r
- using System;4 |! O& m$ E0 ~" W& o. U- G/ n) V
- using System.Diagnostics;7 e& Y# v8 ^" C+ j& _+ z
- using System.IO;+ q# u8 I: n) L! s) L5 a5 U: ?
3 _3 V# I3 A8 k) C% T! O/ @. Y# K- class Program0 S! X+ H( O8 l1 G
- {
; C' N( ]0 }5 `; { - static void Main(string[] args)2 F; v9 s5 h1 W' z# ~* f
- {$ e9 |4 J: J$ s2 x+ R
- Console.WriteLine("cvtWave");- \) c3 z0 V0 I+ M. x$ j
- Console.WriteLine("请输入源文件夹路径 (folder1):");) x5 j2 {6 n5 h: ?7 \0 [
- string sourceFolder = Console.ReadLine();
4 j& P6 _5 _; y, j - Console.WriteLine("请输入目标文件夹路径 (folder2):");$ z0 b& `1 v1 r. ]! y m
- string destinationFolder = Console.ReadLine();
' h- D& P: I- X A. {
! f1 D: m6 p8 ]! ?- ConvertFilesToWAV(sourceFolder, destinationFolder);
( S' U, s8 N/ U( N - 9 i3 j) v3 G5 F. _9 w, h' K
- Console.WriteLine("转换完成.");
2 ^+ i0 L! L+ b9 d" { - }1 |6 C' a6 U" n. V0 S+ i9 `* E5 }) a
- / v/ J; \9 S3 r, I
- static void ConvertFilesToWAV(string sourceFolder, string destinationFolder)
; |. X! t9 M7 b% i! t9 P$ J0 ] - {
. K+ W* c% t5 Q) O6 u - foreach (var sourceFilePath in Directory.GetFiles(sourceFolder, "*.*", SearchOption.AllDirectories))
?7 P' r o5 ^ - {$ [. G. q( w! N
- string extension = Path.GetExtension(sourceFilePath).ToLower();
7 \% E% d* ]/ `- D Z
* \: ~9 n4 E/ _ z- if (extension == ".mp4" || extension == ".avi" || extension == ".mp3")1 G7 c1 x+ b: O/ m* A0 @4 ~
- {
% o* _" f& {" |7 H' h) |/ i2 k8 y% h - string relativePath = Path.GetRelativePath(sourceFolder, sourceFilePath);
. S7 H* q0 ^8 ?% L# ^1 ? - string destinationFilePath = Path.Combine(destinationFolder, relativePath);8 B1 ~( t4 L! h/ v1 X
- destinationFilePath = Path.ChangeExtension(destinationFilePath, ".wav");4 o' @* G. M% E, ?6 Q
. X- p2 _9 u. R* k0 U, r' Y+ ?; X) ^- Directory.CreateDirectory(Path.GetDirectoryName(destinationFilePath));
- Z# Y- O# C" C$ g - " A* N0 x3 I7 l/ o# M; h, F
- string ffmpegArgs = $"-i \"{sourceFilePath}\" -f wav -vn -b:a 256K -ar 16000 -y \"{destinationFilePath}\"";
) i4 |; C% }) Y5 D# o
& Q0 d* A; z% a- V1 J- Process ffmpegProcess = new Process' \/ D3 }; ~' R& @4 n
- {
/ M6 ]7 u5 t7 t6 M3 H" a# G* i, O - StartInfo = new ProcessStartInfo
, O1 I4 R0 j0 n2 t" p5 h/ M! J3 B - {% i) N! _+ J- N; L( Q) W
- FileName = "ffmpeg64.exe",0 Q+ `- r" P5 Q. q P
- Arguments = ffmpegArgs,* I2 W/ ~, U. o4 l1 y6 x
- UseShellExecute = false,4 U T! S* o* [, Q3 \, Q {
- RedirectStandardError = true,
) @2 M1 s1 r' a: v6 F - CreateNoWindow = true
# R4 Y& p9 q, D, F3 i: ?8 [ - }
; v+ o9 h0 K! |( M' x - };. R. F+ M! J3 z$ H- D
- * J" x5 y- ~& i+ v
- ffmpegProcess.Start();9 ^) f* R# w4 z& U; E+ V: }* f5 E2 F
- + z! D3 B; K+ `9 e0 @; |' n9 g* E/ A
- while (!ffmpegProcess.StandardError.EndOfStream). Y% g: O% S. O4 o* \+ L" A8 y
- {
1 z- j+ z0 B4 Y N0 a# U5 O - string line = ffmpegProcess.StandardError.ReadLine();
: Q+ A) D; o* @ - Console.WriteLine(line);: _0 U6 B. ~7 v! L, J. A5 y2 |
- }* m" E R( P7 n0 {7 I, Q
/ x# v, s& U- X7 I8 O" y V% Z' D6 Y, T- ffmpegProcess.WaitForExit();3 U2 D6 z! L# e0 w
- }
7 Q' Z) v) X! Q! R6 I, u9 V2 F - }" E- C, H4 [; B
- }
4 O2 U2 g7 c# \7 ], j4 C' v - }
! o$ A1 H) D1 a# ]( \
复制代码 * M" L& o9 S# c1 p6 E; l
m" z$ t2 n) V; ? {/ _& p0 z
* U4 l2 K) F ]& A& g
+ L) a- T$ ~3 O- b* E" U3 ]
|