Python音频处理,录制播放

这篇具有很好参考价值的文章主要介绍了Python音频处理,录制播放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、内容

  • Simpleaudio:支持numpy数组播放

  • sounddevice 和 soundfile:支持播放和录制包含音频信号的 NumPy 数组

  • pydub:必须预先安装至少一个来自(simpleaudio、pyaudio、ffplay 和 avplay)的音频播放包。可以查看音频信息(时长,分贝)

  • pyaudio 和 wave:录制和连续音频流

  • moviepy:视频音频剪辑处理

二、pyaudio录音和播放

  1. 播放

import pyaudio
import wave

filename = 'path-to_file.wav'

# Set chunk size of 1024 samples per data frame
chunk = 1024 

# Open the soaudio/sound file
af = wave.open(filename, 'rb')

# Create an interface to PortAudio
pa = pyaudio.PyAudio()

# Open a .Stream object to write the WAV file
# 'output = True' indicates that the
# sound will be played rather than
# recorded and opposite can be used for recording
stream = pa.open(format = pa.get_format_from_width(af.getsampwidth()),
                channels = af.getnchannels(),
                rate = af.getframerate(),
                output = True)

# Read data in chunks
rd_data = af.readframes(chunk)

# Play the sound by writing the audio
# data to the Stream using while loop
while rd_data != '':
    stream.write(rd_data)
    rd_data = af.readframes(chunk)

# Close and terminate the stream
stream.stop_stream()
stream.close()
pa.terminate()

2. 录制

import pyaudio
import wave

# Record in chunks of 1024 samples
chunk = 1024 

# 16 bits per sample
sample_format = pyaudio.paInt16 
chanels = 2

# Record at 44400 samples per second
smpl_rt = 44400 
seconds = 4
filename = "path_of_file.wav"

# Create an interface to PortAudio
pa = pyaudio.PyAudio() 

stream = pa.open(format=sample_format, channels=chanels,
                 rate=smpl_rt, input=True,
                 frames_per_buffer=chunk)

print('Recording...')

# Initialize array that be used for storing frames
frames = [] 

# Store data in chunks for 8 seconds
for i in range(0, int(smpl_rt / chunk * seconds)):
    data = stream.read(chunk)
    frames.append(data)

# Stop and close the stream
stream.stop_stream()
stream.close()

# Terminate - PortAudio interface
pa.terminate()

print('Done !!! ')

# Save the recorded data in a .wav format
sf = wave.open(filename, 'wb')
sf.setnchannels(chanels)
sf.setsampwidth(pa.get_sample_size(sample_format))
sf.setframerate(smpl_rt)
sf.writeframes(b''.join(frames))
sf.close()

三、pydub调整音量

1、调整音量大小

读取文件

from pydub import AudioSegment
from pydub.playback import play  #播放

audio = AudioSegment.from_mp3('./1.mp3')
#tape = AudioSegment.from_wav('path_to_myfile.wav')
#tape = AudioSegment.from_file('path_to_myfile.wav', format='wav')

#放大6db音量
audio_big = audio + 6

#减弱3db音量
audio_small = audio - 3
play(audio)

2 、音频切片与合并

获取录音的某个时间段,以毫秒为单位。

start = 10000
end   = 20000
#切片
audio_temp = audio[start:end]
#合并
audio_temp = audio_temp+ audio_temp
#查看时长
audio_temp.duration_seconds
#导出
audio_temp.export(".wav", format="wav")

四、sounddevice播放numpy

import soundfile as sf
import sounddevice as sd

array, smp_rt = sf.read(song, dtype = 'float32') 
sd.play(array, smp_rt,)
status = sd.wait() 
sd.stop()

五、python去除静音

去除语音中静音段,ffmpeglibrosa均有提供功能,但是其去除静音段有一定局限性,只能去掉文件两端的静音段,而对于文件中间存在的静音段则无法去除,在此基础上,去除语音文件中任意地方的静音段

  1. 求取语音的mfcc参数,并选取其含有能量信息的mfcc0作为端点检测的输入特征

  1. 对mfcc0特征进行中值滤波,平滑mfcc0参数

  1. 确定静音帧阈值,即认为超过多少帧的间隔,我们认为是静音段

  1. 去除筛选出的静音段

  1. 在原文件中剔除静音段,得到端点检测后的语音序列

import librosa
import soundfile as sf
import numpy as np
from scipy.signal import medfilt

#忽略警告
import warnings
warnings.filterwarnings('ignore')
'''
将帧转换为时间刻度
'''
def frame2Time(frameNum, framelen, inc, fs):
    frames = np.array(range(0, frameNum, 1))
    frames = frames * inc + framelen / 2
    frameTime = frames / fs
    return frameTime
'''
去除静音的函数
'''
def slience(filename):
    
    frame_threshold=10#该参数决定去掉连续多少帧的静音段,比如某段语音检测到有12帧的静音帧,则去掉这一段的语音,而如果检测到只有8帧,那么不操作
        
    # 求取MFCCs参数
    y, sr = librosa.load(filename, sr=16000)
    mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=24,win_length=1024,hop_length=512,n_fft=1024)

    # # 对mfcc进行中值滤波
    Mfcc1 = medfilt(mfccs[0, :], 9)
    pic = Mfcc1
    start = 0
    end = 0
    points = []
    min_data = min(pic) * 0.9

    for i in range((pic.shape[0])):
        if (pic[i] < min_data and start == 0):
            start = i
        if (pic[i] < min_data and start != 0):
            end = i

        elif (pic[i] > min_data and start != 0):
            hh = [start, end]
            points.append(hh)
            start = 0

    # 解决 文件的最后为静音
    if (pic[-1] < min_data and start != 0):
        hh = [start, end]
        points.append(hh)
        start = 0
    distances = []
    for i in range(len(points)):

        two_ends = points[i]
        distance = two_ends[1] - two_ends[0]
        if (distance > frame_threshold):
            distances.append(points[i])
    

    # 保存到本地文件夹
    name = filename.split('\\')[-1]

    # 取出来端点,按照端点,进行切割,分情况讨论:1.如果未检测到静音段 2.检测到静音段

    if (len(distances) == 0):
        # print('检测到的静音段的个数为: %s 未对文件进行处理:' % len(distances))
        return y
        # sf.write(slience_clean, clean_data, 16000)

    else:
        slience_data = []
        for i in range(len(distances)):
            if (i == 0):
                start, end = distances[i]
                # 将左右端点转换到 采样点

                if (start == 1):
                    internal_clean = y[0:0]
                else:
                    # 求取开始帧的开头
                    start = (start - 1) * 512
                    # 求取结束帧的结尾
                    end = (end - 1) * 512 + 1024
                    internal_clean = y[0:start - 1]

            else:
                _, end = distances[i - 1]
                start, _ = distances[i]
                start = (start - 1) * 512
                end = (end - 1) * 512 + 1024
                internal_clean = y[end + 1:start]

            hhh = np.array(internal_clean)
            # 开始拼接
            slience_data.extend(internal_clean)

        # 开始 添加 最后一部分,需要分情况讨论,1. 文件末尾本来就是静音的  2.文件末尾不是静音的
        ll = len(distances)
        _, end = distances[ll - 1]
        end = (end - 1) * 512 + 1024
        end_part_clean = y[end:len(y)]
        slience_data.extend(end_part_clean)
        # 写到本地
        # sf.write("./data/{}.wav".format(name), slience_data, 16000)

        return slience_data

六、python实时静音检测

  • py-webRTCvad

七、python视频转音频

from moviepy.editor import *
videofile=VideoFileClip(x)#x文件名
audio=videofile.audio
audio.write_audiofile('x.mp3')#保存文件的名称

References

https://www.moonapi.com/news/2810.html

https://blog.csdn.net/weixin_38468077/article/details/121677376文章来源地址https://www.toymoban.com/news/detail-729276.html

到了这里,关于Python音频处理,录制播放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RK3568 alsa 音频 录制与播放

    ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构。 在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为咱们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,便可以完成对底层音频硬件的控制。 aplay -l 显示实际声卡序号 查看声卡:

    2024年02月13日
    浏览(31)
  • Android录制音频并使用ijkplayer播放

    在使用AudioRecorder时,需要了解采样率、频道配置和PCM音频格式数据的相关知识; PCM:音频的原始数据(AudioFormat.ENCODING_PCM_16BIT、AudioFormat.ENCODING_PCM_8BIT、AudioFormat.ENCODING_PCM_FLOAT等等);不同的PCM代表不同的位深 采样率:录音设备在单位时间内对模拟信号采样的多少,采样频

    2023年04月09日
    浏览(31)
  • [语音识别] 基于Python构建简易的音频录制与语音识别应用

    语音识别技术的快速发展为实现更多智能化应用提供了无限可能。本文旨在介绍一个基于Python实现的简易音频录制与语音识别应用。文章简要介绍相关技术的应用,重点放在音频录制方面,而语音识别则关注于调用相关的语音识别库。本文将首先概述一些音频基础概念,然后

    2024年02月12日
    浏览(33)
  • 如何使用python播放音频

    在Python中,我们可以使用多种库来播放音频文件,其中最常用的是pygame库和playsound库。 以下是使用这些库的示例: 使用pygame库: 在这个例子中,你需要将\\\"your_audio_file.mp3\\\"替换成你要播放的音频文件的路径。注意,pygame库支持多种音频格式,包括.mp3, .wav等。 使用playsound库:

    2024年02月08日
    浏览(36)
  • python音频播放问题解决方法

    只是为了验证问题存在,所以就提供了一个获取音频的方法,就是白嫖了。 根据有道翻译的发音获取到地址: https://dict.youdao.com/dictvoice?le=autoaudio=大家好 播放音频通过两种方式,分别通过 playsound 和 pyaudio 两种库,具体使用哪个看个人爱好,两个在使用过程中都遇到过一点小

    2023年04月08日
    浏览(30)
  • 使用playsound播放音频(python)

    安装 使用方法例如: playsound模块 只包含一个东西 ——playsound函数。 它需要一个参数—包含您想要播放的声音的文件的路径。这可能是一个本地文件,也可能是一个URL。 还有一个可选的第二个参数block,默认设置为True。将其设置为False将使函数异步运行。 在Windows上,使用

    2023年04月08日
    浏览(27)
  • Python实现本地视频/音频播放器

    在Python中,有几个库可以用于视频播放,但是没有一个库是完美的,因为它们可能依赖于外部软件或有一些限制。 先看介绍用Python实现本地视频播放器,再介绍用Python实现本地音乐播放器。 Python 实现本地视频播放器 与HTML5+JavaScript实现本地视频播放器相比,使用Python实现比

    2024年04月26日
    浏览(28)
  • python方便地播放、停止音频,不阻塞(arcade)

    在python中,如果你想要特别方便地播放音频,就用playsound,但他也只有播放音频这一个功能,不光不能停止,他还会阻塞程序;如果要对音频进行专业处理,可以用pybub之类的专业库,但是这样又略显繁琐。对于初学者来说,在一个程序中播放音频大概率并不是最主要的功能

    2024年02月11日
    浏览(55)
  • 让音乐响起:使用Python和Pygame轻松播放音频文件

    在这个数字化时代,音频和音乐已成为我们日常生活的一部分。不管是为了放松、学习还是工作,一个好的音乐播放器总是必不可少的。但你知道吗?用Python和Pygame,你可以轻松地制作自己的音频播放器!本文将引导你完成这一过程,让你体验到编程带来的乐趣和成就感。

    2024年02月22日
    浏览(29)
  • HarmonyOS鸿蒙开发指南:基于ArkTS开发 音频录制开发指导

    目录 场景介绍 开发步骤 全流程场景 正常录制场景 音频录制的主要工作是捕获音频信号

    2024年01月19日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包