• Speech | 语音处理,分割一段音频(python)


    本文主要是关于语音数据在处理过程中的一些脚本文件以及实例,所有代码只需要更改所需处理的文件路径,输出路径等,全部可运行。

    目录

    所需环境

    方法1:将一整段音频按时间批量切成一个一个音频

    方法2:将一整段音频按语句停顿批量切成一个一个音频

    方法3:将一个文件夹内的几整段音频批量切成一个一个音频

    3.1.数据格式:一个文件夹下的长几分多的音频(wav文件)按固定秒数切割

    3.2.数据格式:一个文件夹下的长几分多的音频(mp3文件)按固定秒数切割

    3.3.数据格式:一个文件夹下的长几分多的音频(wav文件)按语句停顿切割

    扩展

    将pcm文件批量处理成wav文件

    Linux下查询文件夹中文件数量的方法

    使用ls命令和wc命令

    WAV格式文件详解


    所需环境

    本文环境:Linux

    pydub(安装:pip3 install pydub)

    ffmpeg(apt install ffmpeg)

    方法1:将一整段音频按时间批量切成一个一个音频

    数据格式:一个长三分五十秒的音频

    1. # split_wav_time.py
    2. from pydub import AudioSegment
    3. from pydub.utils import make_chunks
    4. audio = AudioSegment.from_file("his_one/1.wav", "wav")
    5. #size = 10000 #切割的毫秒数 10s=10000
    6. size = 60000 #切割的毫秒数 60s=60000
    7. chunks = make_chunks(audio, size) #将文件切割为60s一个
    8. for i, chunk in enumerate(chunks):
    9. chunk_name = "new-{0}.wav".format(i)
    10. print(chunk_name)
    11. chunk.export(chunk_name, format="wav")

    运行命令:

    python split_wav_time.py

     结果:

    方法2:将一整段音频按语句停顿批量切成一个一个音频

    数据格式:一个长几分多的音频

    利用split_on_silence(sound,min_silence_len,   silence_thresh,    keep_silence=400)函数

    第一个参数为待分割音频,第二个为多少秒“没声”代表沉默,第三个为分贝小于多少dBFS时代表沉默,第四个为为截出的每个音频添加多少ms无声

    1. from pydub import AudioSegment
    2. from pydub.silence import split_on_silence
    3. sound = AudioSegment.from_mp3("his_one/1.wav")
    4. loudness = sound.dBFS
    5. #print(loudness)
    6. chunks = split_on_silence(sound,
    7. # must be silent for at least half a second,沉默半秒
    8. min_silence_len=430,
    9. # consider it silent if quieter than -16 dBFS
    10. silence_thresh=-45,
    11. keep_silence=400
    12. )
    13. print('Len:', len(chunks))
    14. # 放弃长度小于2秒的录音片段
    15. for i in list(range(len(chunks)))[::-1]:
    16. if len(chunks[i]) <= 2000 or len(chunks[i]) >= 10000:
    17. chunks.pop(i)
    18. print('取有效分段(大于2s小于10s):', len(chunks))
    19. '''
    20. for x in range(0,int(len(sound)/1000)):
    21. print(x,sound[x*1000:(x+1)*1000].max_dBFS)
    22. '''
    23. for i, chunk in enumerate(chunks):
    24. chunk.export("cutwav_{0}.wav".format(i), format="wav")
    25. #print(i)

      结果:

    方法3:将一个文件夹内的几整段音频批量切成一个一个音频

    3.1.数据格式:一个文件夹下的长几分多的音频(wav文件)按固定秒数切割

    1. from pydub import AudioSegment
    2. from pydub.utils import make_chunks
    3. import os, re
    4. # # 循环目录下所有文件
    5. for each in os.listdir("/workspace/tts/PolyLangVITS/history"): #循环目录
    6. filename = re.findall(r"(.*?)\.wav", each) # 取出.wav后缀的文件名
    7. print(each)
    8. if each:
    9. # filename[0] += '.wav'
    10. # print(filename[0])
    11. mp3 = AudioSegment.from_file('/workspace/tts/PolyLangVITS/history/{}'.format(each), "wav") # 打开mp3文件
    12. # # # mp3[17*1000+500:].export(filename[0], format="mp3") #
    13. size = 15000 # 切割的毫秒数 10s=10000
    14. chunks = make_chunks(mp3, size) # 将文件切割为15s一块
    15. for i, chunk in enumerate(chunks):
    16. chunk_name = "{}-{}.wav".format(each.split(".")[0],i)
    17. print(chunk_name)
    18. chunk.export('/workspace/tts/PolyLangVITS/preprodata/his_out/{}'.format(chunk_name), format="wav")

     结果

    3.2.数据格式:一个文件夹下的长几分多的音频(mp3文件)按固定秒数切割

    1. from pydub import AudioSegment
    2. from pydub.utils import make_chunks
    3. import os, re
    4. # #
    5. # # 循环目录下所有文件
    6. for each in os.listdir("D:/纯音乐"): #循环目录
    7. filename = re.findall(r"(.*?)\.mp3", each) # 取出.mp3后缀的文件名
    8. print(each)
    9. if each:
    10. # filename[0] += '.wav'
    11. # print(filename[0])
    12. mp3 = AudioSegment.from_file('D:/纯音乐/{}'.format(each), "mp3") # 打开mp3文件
    13. # # # mp3[17*1000+500:].export(filename[0], format="mp3") #
    14. size = 15000 # 切割的毫秒数 10s=10000
    15. chunks = make_chunks(mp3, size) # 将文件切割为15s一块
    16. for i, chunk in enumerate(chunks):
    17. chunk_name = "{}-{}.mp3".format(each.split(".")[0],i)
    18. print(chunk_name)
    19. chunk.export('D:/纯音乐分解/{}'.format(chunk_name), format="mp3")```

     3.3.数据格式:一个文件夹下的长几分多的音频(wav文件)按语句停顿切割

     

    1. # @ Elena
    2. # @ Date : 23.9.4
    3. import os, re
    4. from pydub import AudioSegment
    5. from pydub.silence import split_on_silence
    6. # # 循环目录下所有文件
    7. for each in os.listdir("/workspace/tts/PolyLangVITS/history"):
    8. filename = re.findall(r"(.*?)\.wav", each) # 取出.wav后缀的文件名
    9. print(each)
    10. if each:
    11. sound = AudioSegment.from_file('/workspace/tts/PolyLangVITS/history/{}'.format(each), "wav")
    12. loudness = sound.dBFS
    13. #print(loudness)
    14. chunks = split_on_silence(sound,
    15. # must be silent for at least half a second,沉默半秒
    16. min_silence_len=430,
    17. # consider it silent if quieter than -16 dBFS
    18. silence_thresh=-45,
    19. keep_silence=400
    20. )
    21. print('Len:', len(chunks))
    22. # 放弃长度小于1秒的录音片段
    23. for i in list(range(len(chunks)))[::-1]:
    24. if len(chunks[i]) <= 1000 or len(chunks[i]) >= 10000:
    25. chunks.pop(i)
    26. print('Len (1s~10s wav file):', len(chunks))
    27. '''
    28. for x in range(0,int(len(sound)/1000)):
    29. print(x,sound[x*1000:(x+1)*1000].max_dBFS)
    30. '''
    31. for i, chunk in enumerate(chunks):
    32. chunk_name = "{}-{}.wav".format(each.split(".")[0],i)
    33. chunk.export("/workspace/tts/PolyLangVITS/preprodata/his_out/{}".format(chunk_name), format="wav")
    34. #print(i)

    结果

    使用 file 查询  wav

    (WAV文件格式是Microsoft的RIFF规范的一个子集,用于存储多媒体文件。WAV(RIFF)文件由若干个Chunk组成,分别为: RIFF WAVE Chunk,Format Chunk,Fact Chunk(可选),Data Chunk。具体格式如下:)

    扩展

    将pcm文件批量处理成wav文件

    1. import wave
    2. import os
    3. filepath = "data/" # 添加路径
    4. filename = os.listdir(filepath) # 得到文件夹下的所有文件名称
    5. #f = wave.open(filepath + filename[1], 'rb')
    6. #print(filename)
    7. for i in range(len(filename)):
    8. with open("data/"+failename[i], 'rb') as pcmfile:
    9. pcmdata = pcmfile.read()
    10. with wave.open("data/"+filename[i][:-3] + '.wav', 'wb') as wavfile:
    11. wavfile.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
    12. wavfile.writeframes(pcmdata)

    Linux下查询文件夹中文件数量的方法

    使用ls命令和wc命令

    使用ls命令的-l选项和管道操作符|结合wc命令来统计文件数量:

    查询当前文件夹下带有“wav”的文件数量

    ls -l | grep "wav" | wc -l

     

    WAV格式文件详解

    WAV文件格式是Microsoft的RIFF规范的一个子集,用于存储多媒体文件。WAV(RIFF)文件由若干个Chunk组成,分别为: RIFF WAVE Chunk,Format Chunk,Fact Chunk(可选),Data Chunk。具体格式如下:

    音频文件参数简介
    对于形如44100HZ 16bit stereo 或者 22050HZ 8bit mono参数描述的音频文件,其蕴含的文件参数包括:

    采样率:声音信号在“模→数”转换过程中单位时间内采样的次数。
    采样值(采样精度):每一次采样周期内声音模拟信号的积分值。
    同时,每个采样数据记录的是振幅, 而采样精度取决于储存空间的大小。
    对于单声道(mono)文件,采样数据为8位的短整数,同时其采样精度有:

    1 字节(8bit) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级;
    2 字节(16bit) 可以细到 65536 个数, 即为 CD 标准;
    4 字节(32bit) 能把振幅细分到 4294967296 个等级, 实在是没必要了。
    对于双声道立体声(stereo)文件,每次采样数据为一个16位的整数(int),且采样是双份的,也为单声道文件的两倍。采样数据中高八位(左声道)和低八位(右声道)分别代表两个声道。

    由于wav格式文件本质上为音频文件,即可根据文件的大小、采样频率和采样大小估算文件的播放长度。
    更多可查看Microsoft WAVE soundfile format (sapp.org)

  • 相关阅读:
    SpringBoot中过滤器与拦截器的区别
    【优化覆盖】基于matlab果蝇算法求解无线传感器覆盖优化问题【含Matlab源码 2215期】
    Centos7安装Docker
    思科交换机65系列配置
    UML建模语言分析和设计
    C++移动语义
    如何分析伦敦金的价格走势预测?
    Pflag、Viper、Cobra 核心功能介绍
    div和span标签的使用
    自定义构建rpm包
  • 原文地址:https://blog.csdn.net/weixin_44649780/article/details/132672659