因为工作中会经常遇到不同采样率的声音文件的问题,特意写了一下重采样的程序。
原理就是把采样点转换到时间刻度之后再进行插值,经过测试,是没有问题的。
#!/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,语音,重采样函数
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
白云城资源网 Copyright www.dyhadc.com
暂无“基于Python 的语音重采样函数解析”评论...
更新日志
2024年11月08日
2024年11月08日
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]