基于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 相关文章推荐
pycharm 使用心得(五)断点调试
Jun 06 Python
对numpy 数组和矩阵的乘法的进一步理解
Apr 04 Python
Django 使用logging打印日志的实例
Apr 28 Python
Python中format()格式输出全解
Apr 12 Python
libreoffice python 操作word及excel文档的方法
Jul 04 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
Jan 17 Python
Tensorflow 实现释放内存
Feb 03 Python
python爬虫用mongodb的理由
Jul 28 Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 Python
2020版Python学习路线图(附学习资料)
Sep 15 Python
python 调用API接口 获取和解析 Json数据
Sep 28 Python
python中validators库的使用方法详解
Sep 23 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 SQL之where语句生成器
2009/03/24 PHP
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
解析PHP中如何将数组变量写入文件
2013/06/06 PHP
php生成二维码
2015/08/10 PHP
PHP实现的同步推荐操作API接口案例分析
2016/11/30 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
2013/04/26 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
BootStrap Progressbar 实现大文件上传的进度条的实例代码
2016/06/27 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
2018/04/20 jQuery
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
Vue指令之 v-cloak、v-text、v-html实例详解
2019/08/08 Javascript
详解Vite的新体验
2021/02/22 Javascript
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
简单了解python PEP的一些知识
2019/07/13 Python
python tkinter窗口最大化的实现
2019/07/15 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
python实现简单银行管理系统
2019/10/25 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
python新手学习使用库
2020/06/11 Python
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
大学新生欢迎词
2014/01/10 职场文书
厨房领班竞聘演讲稿
2014/04/23 职场文书
幼儿园辞职书
2015/02/26 职场文书
超搞笑婚前保证书
2015/05/08 职场文书
初婚初育证明范本
2015/06/18 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
python析构函数用法及注意事项
2021/06/22 Python
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android