【问题标题】:Using Python to run a sox command for converting wav files使用 Python 运行 sox 命令来转换 wav 文件
【发布时间】:2019-11-28 22:53:41
【问题描述】:

我想用 Python 处理 .wav 文件。特别是,我想执行以下操作

sox input.wav -c 1 -r 16000 output.wav

在我文件夹中的每个 .wav 文件中。我的代码如下:

#!/usr/bin/python
# encoding=utf8
# -*- encoding: utf -*-

import glob
import subprocess

segments= []
for filename in glob.glob('*.wav'):
        new_filename = "converted_" + filename
        subprocess.call("sox" + filename + "-c 1 -r 16000" + new_filename, shell=True)

但是,它没有按预期工作,它没有调用我的命令。

【问题讨论】:

  • 不应该是"sox " + filename + " -c 1 -r 16000 " + new_filename吗?

标签: python wav sox


【解决方案1】:

当你写作时

subprocess.call("sox" + filename + "-c 1 -r 16000" + new_filename, shell=True)

示例性TEST.WAV 文件实际执行的内容如下所示:

soxTEST.WAV-c 1 -r 16000converted_TEST.WAV

所以你错过了两者之间的空格。使用 Python 的 f 字符串 (Formatted string literals) 的一个很好的解决方案是这样的:

subprocess.call(f"sox {filename} -c 1 -r 16000 {new_filename}", shell=True)

但是,我建议切换到 subprocess.run 并忽略 shell=True 标志:

subprocess.run(["sox", filename, "-c 1", "-r 16000", new_filename])

更多信息参见文档https://docs.python.org/3/library/subprocess.html

注意:在使用shell=True 之前,请阅读Security Considerations 部分。

【讨论】:

  • 是的,我不知道为什么它不起作用。它适用于其他文件,但不适用于 .wav 文件。我改用for filename in Path('AUDIO').rglob('*.wav'):。谢谢!感恩节快乐!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多