基于Python 的语音重采样函数解析


Posted in Python onJuly 06, 2020

因为工作中会经常遇到不同采样率的声音文件的问题,特意写了一下重采样的程序。

原理就是把采样点转换到时间刻度之后再进行插值,经过测试,是没有问题的。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 17-7-21 下午2:32
# @Author : Lei.Jinggui
# @Site : http://blog.csdn.net/lccever
# @File : Resample.py
# @Software: PyCharm Community Edition
# @contact: lccever@126.com
import numpy as np
def Resample(input_signal,src_fs,tar_fs):
 '''
 :param input_signal:输入信号
 :param src_fs:输入信号采样率
 :param tar_fs:输出信号采样率
 :return:输出信号
 '''
 dtype = input_signal.dtype
 audio_len = len(input_signal)
 audio_time_max = 1.0*(audio_len-1) / src_fs
 src_time = 1.0 * np.linspace(0,audio_len,audio_len) / src_fs
 tar_time = 1.0 * np.linspace(0,np.int(audio_time_max*tar_fs),np.int(audio_time_max*tar_fs)) / tar_fs
 output_signal = np.interp(tar_time,src_time,input_signal).astype(dtype)
 return output_signal

if __name__ == '__main__':
 import wave
 import pyaudio
 def playSound(audio_data_short, framerate=16000, channels=1):
  preply = pyaudio.PyAudio()
  # 播放声音
  streamreply = preply.open(format=pyaudio.paInt16,
         channels=channels,
         rate=framerate,
         output=True)
  data = audio_data_short.tostring()
  streamreply.write(data)
  streamreply.close()
  preply.terminate()
 wave_file = 'test.wav'
 audio_file = wave.open(wave_file, 'rb')
 audio_data = audio_file.readframes(audio_file.getnframes())
 audio_data_short = np.fromstring(audio_data, np.short)
 src_fs = audio_file.getframerate()
 src_chanels = audio_file.getnchannels()
 if src_chanels > 1:
  audio_data_short = audio_data_short[::src_chanels]
 tar_fs = np.int(src_fs * 0.5)

 playSound(audio_data_short,framerate=src_fs)
 audio_data_short0 = Resample(audio_data_short,src_fs,tar_fs)
 playSound(audio_data_short0,framerate=tar_fs)

补充知识:Python 多线程的退出/停止的一种是实现思路

在使用多线程的过程中,我们知道,python的线程是没有stop/terminate方法的,也就是说它被启动后,你无法再主动去退出它,除非主进程退出了,注意,是主进程,不是线程的父进程.

一个比较合理的方式就是把原因需要放到threading.Thread的target中的线程函数,改写到一个继承类中,下面是一个实现例子

import threading
import time
import os
 
# 原本需要用来启动的无线循环的函数
def print_thread():
 pid = os.getpid()
 counts = 0
 while True:
  print(f'threading pid: {pid} ran: {counts:04d} s')
  counts += 1
  time.sleep(1)
 
# 把函数放到改写到类的run方法中,便可以通过调用类方法,实现线程的终止
class StoppableThread(threading.Thread):
 
 def __init__(self, daemon=None):
  super(StoppableThread, self).__init__(daemon=daemon)
  self.__is_running = True
  self.daemon = daemon
 
 def terminate(self):
  self.__is_running = False
 
 def run(self):
  pid = os.getpid()
  counts = 0
  while self.__is_running:
   print(f'threading running: {pid} ran: {counts:04d} s')
   counts += 1
   time.sleep(1)
 
def call_thread():
 thread = StoppableThread()
 thread.daemon = True
 thread.start()
 
 pid = os.getpid()
 counts = 0
 for i in range(5):
  print(f'0 call threading pid: {pid} ran: {counts:04d} s')
  counts += 2
  time.sleep(2)
 # 主动把线程退出
 thread.terminate()
 
if __name__ == '__main__':
 call_thread()
 print(f'==========call_thread finish===========')
 counts = 0
 for i in range(5):
  counts += 1
  time.sleep(1)
  print(f'main thread:{counts:04d} s')

以上这篇基于Python 的语音重采样函数解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中splitlines()方法的使用简介
May 20 Python
python实现机械分词之逆向最大匹配算法代码示例
Dec 13 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
详解tensorflow载入数据的三种方式
Apr 24 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
Jun 13 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
Python基于Tensor FLow的图像处理操作详解
Jan 15 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
Python中zip函数如何使用
Jun 04 Python
python3.4中清屏的处理方法
Jul 06 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
python基于socket模拟实现ssh远程执行命令
Dec 05 Python
python interpolate插值实例
Jul 06 #Python
基于Python实现2种反转链表方法代码实例
Jul 06 #Python
简单了解Django项目应用创建过程
Jul 06 #Python
如何在mac下配置python虚拟环境
Jul 06 #Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 #Python
使用TensorBoard进行超参数优化的实现
Jul 06 #Python
Django中F函数的使用示例代码详解
Jul 06 #Python
You might like
德生PL330测评
2021/03/02 无线电
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
2012/03/26 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
PHP实现的常规正则验证helper公共类完整实例
2017/04/27 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
一些你可能不熟悉的JS知识点总结
2019/03/15 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
vue组件入门知识全梳理
2020/09/21 Javascript
vue使用vant中的checkbox实现全选功能
2020/11/17 Vue.js
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
2015/07/27 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
Python+OpenCV图片局部区域像素值处理详解
2019/01/23 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
python实现拼接图片
2020/03/23 Python
python实现猜单词游戏
2020/05/22 Python
记一次django内存异常排查及解决方法
2020/08/07 Python
python字典通过值反查键的实现(简洁写法)
2020/09/30 Python
Python random模块的使用示例
2020/10/10 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
鱼油专家:Omegavia
2016/10/10 全球购物
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
预备党员对照检查材料思想汇报
2014/09/24 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript
一行Python命令实现批量加水印
2022/04/07 Python