• 语音信号处理(声速,回声,音高,界面设计PyQt5)_Python语言


    def YuSu(self):     #语速设置       
            f = wave.open(r"test.wav", "rb")
            # 读取格式信息
            # (nchannels, sampwidth, framerate, nframes, comptype, compname)
            params = f.getparams()
            nchannels, sampwidth, framerate, nframes = params[:4]
            # 读取波形数据
            str_data = f.readframes(nframes)
            f.close()
            # 将波形数据转换为数组
            wave_data = np.fromstring(str_data, dtype=np.short)
            time = np.arange(0, nframes) * (1.0 / framerate)
    
            # 要通过我们设定的名字来调用这些组件
            # price_box.toPlainText() 是一个内置的可以读取输入框中的值的函数。
            # 通过函数读取到的是一个 string 类型的值,所以我们需要把他转换成 integer 类型并存在一个price 变量中
            # price = int(self.price_box.toPlainText())
            # value() 是读取spinbox 中值的函数
            yusu = self.yusu_doubleSpinBox.value()
            # 语速设置
            wave_data1 = wave_data.astype(np.short)
            f = wave.open(r"test_yusu.wav", "wb")
    
            # 配置声道数、量化位数和取样频率
            f.setnchannels(1)
            f.setsampwidth(2)
            f.setframerate(yusu * framerate)  #改变采样率
            # 将wav_data转换为二进制数据写入文件
            f.writeframes(wave_data1.tostring())
            f.close()
    
            chunk = 1024
            f = wave.open(r"test_yusu.wav", "rb")
            p = pyaudio.PyAudio()
    
            # 打开声音输出流
            stream = p.open(format=p.get_format_from_width(f.getsampwidth()),
                            channels=f.getnchannels(),
                            rate=f.getframerate(),
                            output=True)
    
            # 写声音输出流进行播放
            while True:
                data = f.readframes(chunk)
                if data == "": break
                stream.write(data)
            stream.close()
            p.terminate()
    
            f = wave.open(r"test_yusu.wav", "rb")
            # 读取格式信息
            # (nchannels, sampwidth, framerate, nframes, comptype, compname)
            params = f.getparams()
            nchannels, sampwidth, framerate, nframes = params[:4]
            # 读取波形数据
            str_data = f.readframes(nframes)
            f.close()
            # 将波形数据转换为数组
            wave_data = np.fromstring(str_data, dtype=np.short)
            time = np.arange(0, nframes) * (1.0 / framerate)
            self.curve2.setData(time, wave_data)
            self.curve2.attach(self.qwtPlot_2)
            self.qwtPlot_2.replot()    

    回声添加,两种方法:叠加法和滤波法

    def HuiSheng(self):
            f = wave.open(r"test.wav", "rb")
            # 读取格式信息
            # (nchannels, sampwidth, framerate, nframes, comptype, compname)
            params = f.getparams()
            nchannels, sampwidth, framerate, nframes = params[:4]
            # 读取波形数据
            str_data = f.readframes(nframes)
            f.close()
    
            # 将波形数据转换为数组
            wave_data = np.fromstring(str_data, dtype=np.short)
            time = np.arange(0, nframes) * (1.0 / framerate)
            huisheng = self.huisheng_spinBox.value()
            # 滤波,一次回声
            b1 = np.array([1])
            b2 = np.zeros([1, 6000])
            b3 = np.array([0.7])
            b = np.append(b1, b2)
            b = np.append(b, b3)
            a = 1
            wave_data = np.append(wave_data, np.zeros([1, nframes]))
            wave_filter = signal.lfilter(b, a, wave_data)
    
            # 写Wave文件
            # t = np.arange(0,np.max(time)*2,1.0/framerate)
    
            # 打开WAV文档
            wave_filter = wave_filter.astype(np.short)
            f = wave.open(r"test_huisheng.wav", "wb")
    
            # 配置声道数、量化位数和取样频率
            f.setnchannels(1)
            f.setsampwidth(2)
            f.setframerate(framerate)
            # 将wav_data转换为二进制数据写入文件
            f.writeframes(wave_filter.tostring())
            f.close()
    
            # 播放声音
            chunk = 1024
            f = wave.open(r"test_huisheng.wav", "rb")
            p = pyaudio.PyAudio()
    
            # 打开声音输出流
            stream = p.open(format=p.get_format_from_width(f.getsampwidth()),
                            channels=f.getnchannels(),
                            rate=f.getframerate(),
                            output=True)
    
            # 写声音输出流进行播放
            while True:
                data = f.readframes(chunk)
                if data == "": break
                stream.write(data)
    
            stream.close()
            p.terminate()
    
            f = wave.open(r"test_huisheng.wav", "rb")
            # 读取格式信息
            # (nchannels, sampwidth, framerate, nframes, comptype, compname)
            params = f.getparams()
            nchannels, sampwidth, framerate, nframes = params[:4]
            # 读取波形数据
            str_data = f.readframes(nframes)
            f.close()
            # 将波形数据转换为数组
            wave_data = np.fromstring(str_data, dtype=np.short)
            time = np.arange(0, nframes) * (1.0 / framerate)
            
            self.curve2.setData(time, wave_data)
            self.curve2.attach(self.qwtPlot_2)
            self.qwtPlot_2.replot()

     界面:

  • 相关阅读:
    Wepy 格式化和语法高亮(vscode)
    TypeError: Cannot read property '_wrapper' of undefined
    Vue 自定义事件传参
    Uncaught (in promise) undefined
    微信小程序 获取用户昵称、头像
    微信小程序scroll-view去除滚动条
    微信小程序从子页面退回父页面时的数据传递 wx.navigateBack()
    wx: wx.showModal 回调函数中调用自定义方法
    c#后端 小程序上传图片
    小程序配置,通用域名配置文件
  • 原文地址:https://www.cnblogs.com/oucxlw/p/9223030.html
Copyright © 2020-2023  润新知