class AudioCommon:
    @staticmethod
    def play_and_rec(infile,usrdefine=None):
        """
        :param infile:
        :param outfile:
        :param devicetuple:
        :return:
        """
        # AudioCommon.send_serialPort_cmd(0)
        if usrdefine is None:
            now = time.time()
            timeArray = time.localtime(now)
            userdefineDate = time.strftime("%Y-%m-%d",timeArray)
            userdefineHour = 'hour_'+time.strftime("%H", timeArray)
            userdefineTime = time.strftime("%Y-%m-%d-%H-%M-%S", timeArray)
            targetPath = 'resultFiles/' + userdefineDate +'/' + userdefineHour
            if not os.path.exists(targetPath):
                os.makedirs(targetPath)
            outfile = targetPath + '/res_' + userdefineTime + '.wav'
        else:
            outfile = usrdefine
        sd.default.device = (AudioCommon.get_device_id(config.INPUT,config.MME),AudioCommon.get_device_id(config.OUTPUT,config.MME))
        datacur,framerate,nchannels = get_data_array(infile)
        dataout = sd.playrec(data=datacur,samplerate=framerate,channels=1,blocking=True,dtype=np.int16)
        make_out_file(outfile,dataout.astype(np.int16),framerate,1)
        # AudioCommon.send_serialPort_cmd(1)
        return outfile

这段代码定义了一个名为AudioCommon的类,其中包含了一个名为play_and_rec的静态方法。下面是逐行的中文解释:

  1. if usrdefine is None::如果用户未指定输出文件名,则执行以下操作:
  2. else::如果用户指定了输出文件名,则使用用户指定的值作为输出文件名
  3. sd.default.device = (AudioCommon.get_device_id(config.INPUT,config.MME),AudioCommon.get_device_id(config.OUTPUT,config.MME)):设置音频设备
  4. datacur,framerate,nchannels = get_data_array(infile):从输入文件中获取音频数据、帧率和声道数
  5. dataout = sd.playrec(data=datacur,samplerate=framerate,channels=1,blocking=True,dtype=np.int16):使用sd.playrec函数播放并录制音频数据
  6. make_out_file(outfile,dataout.astype(np.int16),framerate,1):将录制的音频数据保存到输出文件中
  7. return outfile:返回输出文件名