You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:00:35