基于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 del()函数用法
Mar 24 Python
Python单例模式实例分析
Jan 14 Python
python使用正则表达式分析网页中的图片并进行替换的方法
Mar 26 Python
Python实现字符串匹配算法代码示例
Dec 05 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
Pandas之groupby( )用法笔记小结
Jul 23 Python
python实现局域网内实时通信代码
Dec 22 Python
python zip,lambda,map函数代码实例
Apr 04 Python
什么是python的自省
Jun 21 Python
Python通过字典映射函数实现switch
Nov 06 Python
用Python仅20行代码编写一个简单的端口扫描器
Apr 08 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编程中八种常见的文件操作方式
2006/11/19 PHP
php小偷相关截取函数备忘
2010/11/28 PHP
利用浏览器的Javascript控制台调试PHP程序
2014/01/08 PHP
php实现可运算的验证码
2015/11/10 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
jquery easyui的tabs使用时的问题
2010/03/23 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
JS运动改变单物体透明度的方法分析
2018/01/23 Javascript
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
layui中的switch开关实现方法
2019/09/03 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
python检测lvs real server状态
2014/01/22 Python
Python fileinput模块使用实例
2015/06/03 Python
利用aardio给python编写图形界面
2017/08/21 Python
python实现图片处理和特征提取详解
2017/11/13 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
会计找工作求职信范文
2013/12/09 职场文书
我的大学生活演讲稿
2014/04/25 职场文书
班级年度安全计划书
2014/05/01 职场文书
小学阳光体育活动总结
2014/07/05 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
导游词之河北邯郸
2019/09/12 职场文书