Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python编辑wav文件_Python_Audio - Fatal编程技术网

使用python编辑wav文件

使用python编辑wav文件,python,audio,Python,Audio,在wav文件中的每个单词之间,我都有完全的沉默(我用Hex workshop检查,沉默用0表示) 我怎样才能切断非静音的声音 我正在用python编程 谢谢 我没有这方面的经验,但看看标准库中的模块。那可以做你想做的事。否则,您将不得不以字节流的形式读取文件,一个0字节的剪切序列(但您不能只剪切所有0字节,因为这将使文件无效…您可能需要尝试使用命令行声音处理工具。它有多种模式,其中之一是静音: 静音:删除声音文件开头、中间或结尾的静音。静默是指低于指定阈值的任何内容 它支持多种声音格式,而且速度

在wav文件中的每个单词之间,我都有完全的沉默(我用Hex workshop检查,沉默用0表示)

我怎样才能切断非静音的声音

我正在用python编程


谢谢

我没有这方面的经验,但看看标准库中的模块。那可以做你想做的事。否则,您将不得不以字节流的形式读取文件,一个0字节的剪切序列(但您不能只剪切所有0字节,因为这将使文件无效…

您可能需要尝试使用命令行声音处理工具。它有多种模式,其中之一是
静音

静音:删除声音文件开头、中间或结尾的静音。静默是指低于指定阈值的任何内容

它支持多种声音格式,而且速度相当快,所以解析大文件应该不会有问题

要删除文件中间的静默,请在\u periods下面指定一个负值。然后将该值视为正值,并用于指示应按“代码>上载周期< < /代码>指定的重启处理,使之适合于删除声音文件中间的静默周期。< /P> 不过,我还没有找到任何用于libsox的python构建,但是您可以像使用python中的所有命令行程序一样使用它(或者您可以重写它,然后使用sox源代码作为指导)。

python有一个。您可以使用它打开wav文件进行读取,并使用“getframes(1)”命令逐帧浏览文件

import wave
w = wave.open('beeps.wav', 'r')
for i in range():
frame = w.readframes(1)
返回的帧将是一个包含十六进制值的字节字符串。如果文件为立体声,结果将如下所示(4字节):

如果是单声道,则将有一半的数据(2字节):

由于音频为16位,因此每个通道的长度为2字节。如果为8位,则每个通道仅为一个字节。您可以使用
getsampwidth()
方法来确定这一点。另外,
getchannels()
将确定它是单声道还是立体声

您可以循环这些字节,看看它们是否都等于零,这意味着两个通道都是静默的。在下面的示例中,我使用
ord()
函数将
'\xe2'
十六进制值转换为整数

import wave
w = wave.open('beeps.wav', 'r')
for i in range(w.getnframes()):
    ### read 1 frame and the position will updated ###
    frame = w.readframes(1)

    all_zero = True
    for j in range(len(frame)):
        # check if amplitude is greater than 0
        if ord(frame[j]) > 0:
            all_zero = False
            break

    if all_zero:
        # perform your cut here
        print 'silence found at frame %s' % w.tell()
        print 'silence found at second %s' % (w.tell()/w..getframerate())

值得注意的是,单帧静默不一定表示空白,因为振幅可能超过0标记的正常频率。因此,建议在确定该区域是否为静默区域之前,先观察0处的一定数量的帧。

在剪切之前,您需要提出一些最小连续零数的阈值。否则,您将从正常音频数据的中间删除完全有效的零。您可以遍历wave文件,复制任何非零值,并缓冲零值。当缓冲零并最终遇到下一个非零时,如果缓冲区的采样数少于阈值,请复制它们,否则将其丢弃


不过,Python并不是完成这类任务的好工具(

另请参见

我一直在为我正在从事的一个项目对此主题进行研究,我在提供的解决方案中遇到了一些问题,即确定静默的方法不正确。“更正确”的实现是:

import struct
import wave

wave_file = wave.open("sound_file.wav", "r")

for i in range(wave_file.getnframes()):
    # read a single frame and advance to next frame
    current_frame = wave_file.readframes(1)

    # check for silence
    silent = True
    # wave frame samples are stored in little endian**
    # this example works for a single channel 16-bit per sample encoding
    unpacked_signed_value = struct.unpack("<h", current_frame) # *
    if abs(unpacked_signed_value[0]) > 500:
        silent = False

    if silent:
        print "Frame %s is silent." % wave_file.tell()
    else
        print "Frame %s is not silent." % wave_file.tell()
交织



对于多声道声音(例如,立体声波形),每个声道的单个采样点是交错的。例如,假设一个立体声(即,2声道)波形。不是先存储左声道的所有采样点,然后再存储右声道的所有采样点,而是“混合”将两个通道的采样点放在一起。您将存储左通道的第一个采样点。接下来,您将存储右通道的第一个采样点。接下来,您将存储左通道的第二个采样点。接下来,您将存储右通道的第二个采样点,依此类推,交替存储n每个通道的ext采样点。这就是交错数据的含义;依次存储每个通道的下一个采样点,以便“播放”(即发送到DAC)的采样点同时,你应该考虑清楚地澄清你的问题。我想知道你是在试图消除沉默,还是实际上把你的音频分成不同的块?0个字节可以在纯正正弦波中出现,当跨越0时,想象一个在12525Hz的正弦波上的一个4100Hz采样的文件,看看我的意思。-1,因为答案的其余部分非常好。readframes(i)按顺序返回i帧,而不是位置i处的1帧。因此,循环将返回1帧,然后是2帧,然后是3帧,以此类推。它应该是readframes(1)而不是readframes(i).Fixed,尽管我相信你的话。记住8位WAV是无符号的,而16位WAV是有符号的。我不确定python的WAV是如何处理这个问题的。我宁愿使用更高级的库,比如audiolab。@Soviut什么是
ord(frame[j])
?它是波的振幅吗?
import wave
w = wave.open('beeps.wav', 'r')
for i in range(w.getnframes()):
    ### read 1 frame and the position will updated ###
    frame = w.readframes(1)

    all_zero = True
    for j in range(len(frame)):
        # check if amplitude is greater than 0
        if ord(frame[j]) > 0:
            all_zero = False
            break

    if all_zero:
        # perform your cut here
        print 'silence found at frame %s' % w.tell()
        print 'silence found at second %s' % (w.tell()/w..getframerate())
import struct
import wave

wave_file = wave.open("sound_file.wav", "r")

for i in range(wave_file.getnframes()):
    # read a single frame and advance to next frame
    current_frame = wave_file.readframes(1)

    # check for silence
    silent = True
    # wave frame samples are stored in little endian**
    # this example works for a single channel 16-bit per sample encoding
    unpacked_signed_value = struct.unpack("<h", current_frame) # *
    if abs(unpacked_signed_value[0]) > 500:
        silent = False

    if silent:
        print "Frame %s is silent." % wave_file.tell()
    else
        print "Frame %s is not silent." % wave_file.tell()
         7  6  5  4  3  2  1  0
       +-----------------------+
 char: | lsb               msb |
       +-----------------------+

         7  6  5  4  3  2  1  0 15 14 13 12 11 10  9  8
       +-----------------------+-----------------------+
short: | lsb     byte 0        |       byte 1      msb |
       +-----------------------+-----------------------+

         7  6  5  4  3  2  1  0 15 14 13 12 11 10  9  8 23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24
       +-----------------------+-----------------------+-----------------------+-----------------------+
 long: | lsb     byte 0        |       byte 1          |         byte 2        |       byte 3      msb |
       +-----------------------+-----------------------+-----------------------+-----------------------+