pydub库---语音增强

【Python】利用pydub库操作音频文件

最近使用Python调用百度的REST API实现语音识别,但是百度要求音频文件的压缩方式只能是pcm(不压缩)、wav、opus、speex、amr,这里面也就wav还常见一点,但是一般设备录音得到的文件都是mp3,这就要把mp3转换为wav,由于python的效率并不高,很多实现都是使用C++或者Java,不过GitHub上有一个项目pydub(https://github.com/jiaaro/pydub/tree/master/pydub)可以暂时解决问题。

pip install pydub

 

sudo apt-get install ffmpeg
from pydub import AudioSegment
sound = AudioSegment.from_mp3("/path/to/file.mp3")
sound.export("/output/path", format="wav")

 

sudo apt-get install sox

 

支持播放wav和mp3文件的package是sox,所以sudo apt-get install sox即可使用play命令来播放wav和mp3文件


 

import wave
pcm_path = r'1537176475276.pcm'

with open(pcm_path, 'rb') as pcmfile:
    pcmdata = pcmfile.read()
with wave.open(pcm_path + '.wav', 'wb') as wavfile:
    wavfile.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
    wavfile.writeframes(pcmdata)

wavfile.setparams的参数说明如下: 
声道数, 量化位数(byte单位), 采样频率,采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息 

Python ununtu使用麦克风输入音频

 

Ubuntu 屏幕录制噪音处理

https://blog.csdn.net/weixin_37272286/article/details/81083962

Python:PCM to WAV音频文件 以及ubuntu系统下播放midi文件

https://blog.csdn.net/qq_33266320/article/details/80600126

python调用pyaudio使用麦克风录制wav声音文件用于pytorch语音识别以及Mac/Ubuntu安装pyaudio教程

https://ptorch.com/news/84.html

支持同时听和录音系统音频+ 麦克风输入的pulseaudio?

https://www.helplib.com/ubuntu/article_166209

使用 ffmpeg 提取视频流、音频流
安装 ffmeeg
我们先使用 SimpleScreamRecord 进行屏幕录制,保存为 mkv 格式的视频。然后我们将会使用 ffmpeg 工具进行视频音频的提取操作。

在开始分离视频音频之前,我们需要先检查以下我们是否已经安装 ffmpeg 工具,如果没有安装,我们可以先安装 ffmpeg 工具。

sudo apt install ffmpeg


1分离音频
如果我们想要对视频里面的音频进行处理,首先要把音频提出出来,我们这里会将使用 ffmoeg 工具将视频中的音频提出并保存为 mp3 格式。

ffmpeg -i original_video.mp4 original_audio.mp3

使用 Audacity 对音频降噪

接下来,我们会使用 Audacity 音频处理软件进行降噪处理。如果我们没有安装 Audacity ,可以使用软件中心安装,或者使用命令行安装。

sudo apt-get install audacity

 

将处理完成后的音轨与视频打包
到这里,我们还差最后一步就能完成目标了。我们只需要把处理好的音频与刚才提取出来的视频打包即可。这里,我们会再次使用 ffmpeg 工具完成任务。
合并:

ffmpeg -i video_without_sound.mkv video_sound_clean.mp3 -vcodec copy video_clean.mp4

Ubuntu 设置麦克风降噪
以上使用软件对音频进行降噪,是比较常规的操作,这种方法虽然操作上比较复杂,但无论是对屏幕录制、还是手机、摄像机录制的视频都有效。但是,如果是经常需要使用 Ubuntu 进行麦克风收音、录制的工作,那每次都需要完成上面一连串的套路,显然不方便。如果能做到一劳永逸那自然是最好的。

下面,将演示如何通过修改配置文件从而实现设置麦克风降噪的效果。

完成这一设置我们需要修改 /etc/pulse/default.pa 这一配置文件。一般,我们在修改配置文件之前,最好都先对配置文件进行备份。

sudo cp /etc/pulse/default.pa /etc/pulse/default.pa.bak


然后,我们使用 vim 打开这个配置文件:

sudo vim /etc/pulse/default.pa


然后我们在配置文件的最末尾添加以下配置内容,这里有个 Tips,vim 按 Shift + G 可以直接跳到文章的末尾,按 a 即进入编辑模式,然后将配置内容复制即可。

#Active Noise Removal
.ifexists module-echo-cancel.so
load-module module-echo-cancel aec_method=webrtc source_name=mic source_properties=device.description=MicHD
set-default-source "mic"
.endif


完成之后,我们还需要重启一下pulse 服务!

 

在Ubuntu中安装pyaudio

pip install pyaudio
apt-get install pyaudio

调用pyaudio使用麦克风录制声音

python中的pyaudio库可以直接通过麦克风录制声音,我们可以通过调用该库,获取到wav测试语音。 具体代码如下所示:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

from pyaudio import PyAudio, paInt16 
import numpy as np 
from datetime import datetime 
import wave

class recoder:
    NUM_SAMPLES = 2000      #pyaudio内置缓冲大小
    SAMPLING_RATE = 8000    #取样频率
    LEVEL = 500         #声音保存的阈值
    COUNT_NUM = 20      #NUM_SAMPLES个取样之内出现COUNT_NUM个大于LEVEL的取样则记录声音
    SAVE_LENGTH = 8         #声音记录的最小长度:SAVE_LENGTH * NUM_SAMPLES 个取样
    TIME_COUNT = 60     #录音时间,单位s

    Voice_String = []

    def savewav(self,filename):
        wf = wave.open(filename, 'wb') 
        wf.setnchannels(1) 
        wf.setsampwidth(2) 
        wf.setframerate(self.SAMPLING_RATE) 
        wf.writeframes(np.array(self.Voice_String).tostring()) 
        # wf.writeframes(self.Voice_String.decode())
        wf.close() 

    def recoder(self):
        pa = PyAudio() 
        stream = pa.open(format=paInt16, channels=1, rate=self.SAMPLING_RATE, input=True, 
            frames_per_buffer=self.NUM_SAMPLES) 
        save_count = 0 
        save_buffer = [] 
        time_count = self.TIME_COUNT

        while True:
            time_count -= 1
            # print time_count
            # 读入NUM_SAMPLES个取样
            string_audio_data = stream.read(self.NUM_SAMPLES) 
            # 将读入的数据转换为数组
            audio_data = np.fromstring(string_audio_data, dtype=np.short)
            # 计算大于LEVEL的取样的个数
            large_sample_count = np.sum( audio_data > self.LEVEL )
            print(np.max(audio_data))
            # 如果个数大于COUNT_NUM,则至少保存SAVE_LENGTH个块
            if large_sample_count > self.COUNT_NUM:
                save_count = self.SAVE_LENGTH 
            else: 
                save_count -= 1

            if save_count < 0:
                save_count = 0 

            if save_count > 0 : 
            # 将要保存的数据存放到save_buffer中
                #print  save_count > 0 and time_count >0
                save_buffer.append( string_audio_data ) 
            else: 
            #print save_buffer
            # 将save_buffer中的数据写入WAV文件,WAV文件的文件名是保存的时刻
                #print "debug"
                if len(save_buffer) > 0 : 
                    self.Voice_String = save_buffer
                    save_buffer = [] 
                    print("Recode a piece of  voice successfully!")
                    return True
            if time_count==0: 
                if len(save_buffer)>0:
                    self.Voice_String = save_buffer
                    save_buffer = [] 
                    print("Recode a piece of  voice successfully!")
                    return True
                else:
                    return False

if __name__ == "__main__":
    r = recoder()
    r.recoder()
    r.savewav("test.wav")  

安装出现错误的解决办法

fatal error: 'portaudio.h' file not found
    #include "portaudio.h"
             ^
    1 error generated.
    error: command 'cc' failed with exit status 1

但是portaudio明明已经安装成功,在/usr/local/include目录下也能找到portaudio.h文件,经过万能的百度,在https://stackoverflow.com/questions/33513522/when-installing-pyaudio-pip-cannot-find-portaudio-h-in-usr-local-include找到了解决的办法, 输入命令:

sudo pip install --global-option='build_ext' --global-option='-I/usr/local/include' --global-option='-L/usr/local/lib' pyaudio

不在学习!!!!!!!!!!!!!!

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值