python实现录音功能,可随时停止录音

# -*- coding: utf-8 -*-
"""
Created on Thu Oct 11 15:44:09 2018

@author: zhangxinchun
"""

# -*- coding: utf-8 -*-

import pyaudio
import time
import threading
import wave
import os
import msvcrt



class Recorder():
    def __init__(self, chunk=1024, channels=1, rate=64000):
        self.CHUNK = chunk
        self.FORMAT = pyaudio.paInt16
        self.CHANNELS = channels
        self.RATE = rate
        self._running = True
        self._frames = []
    def start(self):
        threading._start_new_thread(self.__recording, ())
    def __recording(self):
        self._running = True
        self._frames = []
        p = pyaudio.PyAudio()
        stream = p.open(format=self.FORMAT,
                        channels=self.CHANNELS,
                        rate=self.RATE,
                        input=True,
                        frames_per_buffer=self.CHUNK)
        while(self._running):
            data = stream.read(self.CHUNK)
            self._frames.append(data)

        stream.stop_stream()
        stream.close()
        p.terminate()

    def stop(self):
        self._running = False

    def save1(self, filename):
        p = pyaudio.PyAudio()    
        
        if not filename.endswith(".wav"):
            filename = filename + ".wav"
        path = self.positive_path()
       
        filename = path +r'//' + filename
                
        wf = wave.open(filename, 'wb')
        wf.setnchannels(self.CHANNELS)
        wf.setsampwidth(p.get_sample_size(self.FORMAT))
        wf.setframerate(self.RATE)
        wf.writeframes(b''.join(self._frames))
        wf.close()
        print("Saved")
        
    def save2(self, filename):
        p = pyaudio.PyAudio()            
        if not filename.endswith(".wav"):
            filename = filename + ".wav"
        path = self.negative_path()       
        filename = path +r'//' + filename                
        wf = wave.open(filename, 'wb')
        wf.setnchannels(self.CHANNELS)
        wf.setsampwidth(p.get_sample_size(self.FORMAT))
        wf.setframerate(self.RATE)
        wf.writeframes(b''.join(self._frames))
        wf.close()
        print("Saved")
        
    def positive_path(self):
        
        cur_dir = os.getcwd()    
        newpath = 'positive'
        cur_dir = cur_dir + '\\' + newpath
        if os.path.exists(cur_dir):
            pass
        else:
            os.mkdir(cur_dir)       
        return cur_dir 
    def negative_path(self):
        
        cur_dir = os.getcwd()    
        newpath = 'negative'
        cur_dir = cur_dir + '\\' + newpath
        if os.path.exists(cur_dir):
            pass
        else:
            os.mkdir(cur_dir)       
        return cur_dir 
    
    def record(self):
        print('请按下回车键开始录音:')
        
        a = msvcrt.getch()
        a = ord(a)
        if a == 13:        
            begin = time.time()
            print("Start recording")
            self.start()
            print('请按下回车键结束录音:')
            b = msvcrt.getch()
            b = ord(b)
            if b == 13:
                print("Stop recording")
                self.stop()
                fina = time.time()
                t = fina - begin
                print('录音时间为%ds'%t)
    def positive(self):
        count = 0
        i = 2
        m = self.positive_m() 
        print('开始正样本的录制')
        print("请以不同的语速口音说出'你好,小琪'") 
        self.record()
        self.save1("1_1.wav") 
        #for i in range(2,m+count+1):
        while i < (m+count+1):
            print('继续录音请按下回车键,重新录音请输入y or Y:')
            input_YN = msvcrt.getch()
            input_YN = bytes.decode(input_YN)
            if input_YN.upper() == 'Y':
                count += 1
                self.record()
                self.save1("1_%d.wav"%(i-count))
                i += 1
            else:
                self.record()
                self.save1("1_%d.wav"%(i-count))
                i += 1
                
    def negative(self):
        count = 0
        i = 2
        n = self.negative_n()
        print('开始负样本的录制')
        print("请以不同的语速口音朗读文章") 
        self.record()
        self.save2("0_1.wav") 
        while i < (n+count+1):
            print('继续录音请按下回车键,重新录音请输入y or Y:')
            input_YN = msvcrt.getch()
            input_YN = bytes.decode(input_YN)
            if input_YN.upper() == 'Y':
                count += 1
                self.record()
                self.save2("0_%d.wav"%(i-count))
                i += 1
            else:
                self.record()
                self.save2("0_%d.wav"%(i-count)) 
                i += 1
        
                        
    def positive_m(self):
        m = int(input('请设置录制正样本数:'))
        return m
    def negative_n(self):
        n = int(input('请设置录制负样本数:'))
        return n
    
if __name__ == "__main__":
    rec = Recorder()
    rec.positive()
    print('----------------------------------')
    rec.negative()

本人在尝试语音识别领域的研究,欢迎一起探讨

  • 9
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值