最近使用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
https://blog.csdn.net/qq_33266320/article/details/80600126
https://ptorch.com/news/84.html
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
,可以使用软件中心安装,或者使用命令行安装。
sudo apt-get install audacity
将处理完成后的音轨与视频打包
到这里,我们还差最后一步就能完成目标了。我们只需要把处理好的音频与刚才提取出来的视频打包即可。这里,我们会再次使用 ffmpeg 工具完成任务。
合并:
ffmpeg -i video_without_sound.mkv video_sound_clean.mp3 -vcodec copy video_clean.mp4
下面,将演示如何通过修改配置文件从而实现设置麦克风降噪的效果。
完成这一设置我们需要修改 /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 服务!
pip install pyaudio
apt-get install 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
不在学习!!!!!!!!!!!!!!