python - 在音频文件开始处测量静音长度(wav)

标签 python audio unity3d

我走遍了所有有关测量沉默的文章,但不幸的是,我未能找到解决问题的方法。

我大约有3000个音频文件。每个文件长10秒,是某人大声说一个单词的记录。

我需要知道他们说这个单词花了多长时间(=在说这个单词之前保持沉默)。
我读到我可以用公式audioop.rms(fragment,width)来做到这一点,但是我找不到有关如何使用它的说明。

新错误:

void@control:~/Documents$ python audio.py 
Traceback (most recent call last):
  File "audio.py", line 36, in <module>
    leading_silences = {a: get_silence(a, threshold) for a in audio_files}
  File "audio.py", line 36, in <dictcomp>
    leading_silences = {a: get_silence(a, threshold) for a in audio_files}
  File "audio.py", line 7, in get_silence
    song = AudioSegment.from_wav(audio)
  File "/usr/local/lib/python2.7/dist-packages/pydub/audio_segment.py", line 471, in from_wav
    return cls.from_file(file, 'wav')
  File "/usr/local/lib/python2.7/dist-packages/pydub/audio_segment.py", line 387, in from_file
    file = _fd_or_path_or_tempfile(file, 'rb', tempfile=False)
  File "/usr/local/lib/python2.7/dist-packages/pydub/utils.py", line 59, in _fd_or_path_or_tempfile
    fd = open(fd, mode=mode)
IOError: [Errno 2] No such file or directory: 'silbato.wav'

最佳答案

您可以使用@jiarro提供的可爱的pydub库:

from pydub import AudioSegment
from os import listdir
from os.path import isfile, join

def get_silence(audio, threshold, interval):
    "get length of silence in seconds from a wav file"

    # swap out pydub import for other types of audio
    song = AudioSegment.from_wav(audio)

    # break into chunks
    chunks = [song[i:i+interval] for i in range(0, len(song), interval)]

    # find number of chunks with dBFS below threshold
    silent_blocks = 0
    for c in chunks:
        if c.dBFS == float('-inf') or c.dBFS < threshold:
            silent_blocks += 1
        else:
            break

    # convert blocks into seconds
    return round(silent_blocks * (interval/1000), 3)

# get files in a directory
audio_path = 'path/to/directory'
audio_files = [i for i in listdir(audio_path) if isfile(join(audio_path, i))]

threshold = -80 # tweak based on signal-to-noise ratio

interval = 1 # ms, increase to speed up

leading_silences = {a: get_silence(join(audio_path, a),
                                   threshold, interval) for a in audio_files}

# to get tab-separated values:
for name, leading_silence in leading_silences.items():
    print(''.join([name, '\t', str(leading_silence)]))

关于python - 在音频文件开始处测量静音长度(wav),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38231328/

相关文章:

python - 参数必须是字符串、类字节对象或数字,而不是 'slice'

python 如何在运行时更改方法的功能

ios - iOS 8-uibackgroundModes音频可以是随机音频还是必须是连续音频

java - 在java中绘制wav文件

unity3d - 如何在运行时从脚本到 "bake"NavMesh?

c# - PID Controller 即使对于自然角度也返回正值

Python spynner 登录页面问题

python - 使用 matplotlib 简化三角剖分

ios - 在 iPhone 7 的顶部和底部扬声器之间平移声音

c# - 使 texture2D 在运行时/脚本 Unity3D 中可读