如何通过管道将非WAV格式文件传入whisper.cpp进行转录?
解决whisper.cpp非WAV文件一键转录问题
问题背景
whisper.cpp仅支持处理WAV格式文件,若要将其他格式(如AMR)的音频文件通过一行命令完成格式转换与转录,之前尝试的管道命令均失败:
whisper.cpp -m ~/usr/whisper.cpp/models/ggml-large.bin < ffmpeg -i sample.amr -f wav ffmpeg -i sample.amr -f wav pipe:1 | whisper.cpp -m ~/usr/whisper.cpp/models/ggml-large.bin
查看whisper.cpp帮助文档可知,它仅接受WAV文件路径作为输入,不支持从标准输入(stdin)或管道读取数据:
usage: whisper.cpp [options] file0.wav file1.wav ... -f FNAME, --file FNAME [ ] input WAV file path
解决方案
利用bash的进程替换功能,将ffmpeg格式转换的输出包装为临时伪文件,直接传递给whisper.cpp的文件参数。执行以下命令:
whisper.cpp -m ~/usr/whisper.cpp/models/ggml-large.bin -f <(ffmpeg -i sample.amr -f wav -acodec pcm_s16le -ar 16000 -ac 1 -)
命令细节说明
ffmpeg -i sample.amr -f wav -acodec pcm_s16le -ar 16000 -ac 1 -:将AMR文件转成whisper.cpp要求的标准WAV格式(16kHz采样率、16位单声道PCM编码),输出到标准输出<(...):bash进程替换特性,把ffmpeg的输出伪装成一个可读的伪文件路径(如/dev/fd/63),让whisper.cpp可以直接读取- whisper.cpp通过
-f参数指定该伪文件路径,实现格式转换+转录的一键执行
替代方案(临时文件方式)
若进程替换无法使用,可先生成临时WAV文件完成转录,最后清理临时文件:
ffmpeg -i sample.amr -f wav -acodec pcm_s16le -ar 16000 -ac 1 temp.wav && whisper.cpp -m ~/usr/whisper.cpp/models/ggml-large.bin -f temp.wav && rm temp.wav
内容的提问来源于stack exchange,提问作者d-b
相关产品推荐
相关产品推荐

