基于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的Urllib库的基本使用教程
Apr 30 Python
Python的多态性实例分析
Jul 07 Python
Python遍历numpy数组的实例
Apr 04 Python
Python中的函数式编程:不可变的数据结构
Oct 08 Python
Python基础之循环语句用法示例【for、while循环】
Mar 23 Python
python 整数越界问题详解
Jun 27 Python
用Python+OpenCV对比图像质量的几种方法
Jul 15 Python
对Django中内置的User模型实例详解
Aug 16 Python
pandas的resample重采样的使用
Apr 24 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
Apr 30 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 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
用PHP实现将GB编码转换为UTF8
2006/11/25 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
Zend Framework教程之视图组件Zend_View用法详解
2016/03/05 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
2017/04/03 PHP
php-msf源码详解
2017/12/25 PHP
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
js 表格隔行颜色
2009/12/02 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
使用JavaScript获取地址栏参数的方法
2014/12/19 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
Vue项目总结之webpack常规打包优化方案
2019/06/06 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
vue使用Sass时报错问题的解决方法
2020/10/14 Javascript
Python中的Classes和Metaclasses详解
2015/04/02 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
2018/10/30 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
2020/07/20 Python
css3强大的动画效果animate使用说明及浏览器兼容介绍
2013/01/09 HTML / CSS
英国手机零售商:Metrofone
2019/03/18 全球购物
台湾良兴购物网:EcLife
2019/12/01 全球购物
大学生实习自我鉴定
2013/12/11 职场文书
好家长事迹材料
2014/01/23 职场文书
师范学院教师自荐书
2014/01/31 职场文书
大学生两会精神学习心得体会
2014/03/10 职场文书
原材料检验岗位职责
2014/03/15 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫