Python:WAV转FLAC失败,语音转文本脚本报FileNotFoundError
解决WAV转FLAC失败导致的文件找不到问题
这个错误的核心原因是**pacpl转换WAV到FLAC的过程没有成功生成目标文件**,但你的脚本没有检查转换是否成功就继续执行后续步骤,再加上你把转换命令的输出和错误都重定向到了/dev/null,完全看不到转换失败的具体原因,这给排查带来了很大阻碍。
下面是分步解决的方案:
第一步:手动诊断转换命令是否正常工作
先在终端里直接执行转换命令,验证能否成功生成FLAC文件,同时观察是否有报错:
pacpl --overwrite -t flac /Users/amin/AnacondaProjects/audio-transcribe/softkitty.wav
如果执行后没有生成softkitty.flac,或者出现报错,先解决pacpl的基础问题:
- 确认
pacpl已安装:执行pacpl --version,如果提示命令不存在,用对应包管理器安装(比如Debian/Ubuntu用sudo apt install pacpl,macOS用brew install pacpl)。 - 确认FLAC编码器已安装:
pacpl依赖flac工具,执行flac --version检查,未安装则先安装对应包(如sudo apt install flac或brew install flac)。 - 如果文件名包含空格或特殊字符,手动命令里要给文件名加引号:
pacpl --overwrite -t flac "/path/to/your file.wav"。
第二步:修改脚本,增加错误检查与命令调用优化
原脚本存在命令参数拼接不安全、无转换结果校验、屏蔽错误输出等问题,下面是优化后的Python 3.x版本脚本:
#!/usr/bin/env python3 import sys import urllib.request import urllib.error import os import json import subprocess as sp url = "https://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=en-US" fileName = str(sys.argv[1]) fileExtension = os.path.splitext(fileName)[1] converted = False flac_file = os.path.splitext(fileName)[0] + '.flac' if fileExtension != ".flac": print(f"Converting {fileName} to FLAC format...") # 用列表传递参数,避免文件名含特殊字符导致命令解析错误 try: # 不屏蔽输出,方便排查转换过程中的问题 sp.check_call(["pacpl", "--overwrite", "-t", "flac", fileName]) converted = True except sp.CalledProcessError as e: print(f"FLAC转换失败,错误码: {e.returncode}") sys.exit(1) except FileNotFoundError: print("错误:未找到pacpl命令,请先安装pacpl及FLAC编码器") sys.exit(1) # 提前检查FLAC文件是否存在,避免后续步骤报错 if not os.path.exists(flac_file): print(f"错误:FLAC文件 {flac_file} 不存在,转换失败") sys.exit(1) try: binary_audio = open(flac_file, 'rb') except Exception as e: print(f"读取FLAC文件失败: {str(e)}") if converted: os.remove(flac_file) sys.exit(1) size_of_audio = os.path.getsize(flac_file) request = urllib.request.Request(url) request.add_header('Content-type','audio/x-flac; rate=16000') request.add_header('Content-length', str(size_of_audio)) request.add_data(binary_audio.read()) try: response = urllib.request.urlopen(request) except urllib.error.URLError as e: print(f"连接语音API失败: {str(e)}") if converted: os.remove(flac_file) sys.exit(1) except urllib.error.HTTPError as e: print(f"API请求错误: {e.code} - {e.reason}") if converted: os.remove(flac_file) sys.exit(1) content = response.read() try: data = json.loads(content) print(data["hypotheses"][0]["utterance"]) except (KeyError, json.JSONDecodeError) as e: print(f"解析API响应失败: {str(e)}") finally: # 无论成功失败,都清理转换后的FLAC文件 if converted and os.path.exists(flac_file): os.remove(flac_file)
主要优化点:
- 用
sp.check_call替代sp.call,转换命令执行失败时会直接抛出异常,方便捕获并提示错误。 - 命令参数改用列表传递,彻底避免文件名含空格或特殊字符导致的命令解析错误。
- 取消
/dev/null重定向,转换过程的输出和错误会显示在终端,便于排查问题。 - 增加FLAC文件存在性预检查,提前终止错误流程。
- 完善异常分支的资源清理,避免残留临时FLAC文件。
- 增加API响应解析的错误处理,防止返回异常格式JSON导致崩溃。
第三步:测试修改后的脚本
运行优化后的脚本:
python speech.py /Users/amin/AnacondaProjects/audio-transcribe/softkitty.wav
如果仍有问题,终端会显示具体错误信息(如依赖缺失、文件权限不足等),根据提示解决即可。
内容的提问来源于stack exchange,提问作者Amin Memariani
相关产品推荐
相关产品推荐

