def __init__(self, name):
     self.name = name
     self.machine = Machine(model=self,
                            states=StateMachine.states,
                            initial='Wait',
                            auto_transitions=False)
     self.machine.add_transition(trigger='Turn_start',
                                 source='Init',
                                 dest='Turn',
                                 after='turn_table')
     self.machine.add_transition(trigger='Turn_fin',
                                 source='Turn',
                                 dest='Recode',
                                 before='recode')
     self.machine.add_transition(trigger='Rec_fin',
                                 source='Recode',
                                 dest='Wait',
                                 after='wait')
     self.machine.add_transition(trigger='Init_set',
                                 source='Wait',
                                 dest='Init',
                                 before='init')
     self.machine.add_transition(trigger='Turn_res',
                                 source='Wait',
                                 dest='Turn',
                                 after='turn_table')
     self.machine.add_transition(trigger='Next_dis',
                                 source='Wait',
                                 dest='Init',
                                 after='prepare_next')
     self.stage = StageControl()
     self.func = MyFunc()
     self.photo = TakePhoto()
     self.photo_path = self.func.make_dir_path(photo=True)
     self.adjust = 50
 def __init__(self):
     self.mic_path = '../_exp/19' + datetime.today().strftime("%m%d") + '/recode_data/' + \
                     datetime.today().strftime("%H%M%S") + '/'
     self.my_makedirs(self.mic_path)
     # self.mic_index, self.mic_channels = self.get_index('ReSpeaker 4 Mic Array (UAC1.0) ')
     self.mic_name = 'ReSpeaker 4 Mic Array (UAC1.0) '
     self.speak_path = "../_exp/Speaker_Sound/2_up_tsp_1num.wav"
     self.recode_second = 1.2
     self.freq_min = 800
     self.freq_max = 2200
     self.smooth_step = 50
     self.mic_id = 0
     self.model = joblib.load('../../../../OneDrive/Research/_array/200212/svm_200210_PTs09_freq_1000_8000.pkl')
     self.scon = StageControl()
     self.scon.calibrate()
     self.check_ready(200)
 def __init__(self, name, host_ip, port_num, send_size, interval,
              retry_times):
     self.name = name
     self.machine = Machine(model=self,
                            states=StateMachine.states,
                            initial='Wait',
                            auto_transitions=False)
     self.machine.add_transition(trigger='Turn_start',
                                 source='Init',
                                 dest='Turn',
                                 after='turn_table')
     self.machine.add_transition(trigger='Turn_fin',
                                 source='Turn',
                                 dest='Recode',
                                 before='recode')
     # self.machine.add_transition(trigger='Turn_fin', source='Init', dest='Recode', before='recode')
     self.machine.add_transition(trigger='Rec_fin',
                                 source='Recode',
                                 dest='Wait',
                                 after='wait')
     # self.machine.add_transition(trigger='Rec_fin', source='Recode', dest='Init', after='wait')
     self.machine.add_transition(trigger='Init_set',
                                 source='Wait',
                                 dest='Init',
                                 before='init')
     self.machine.add_transition(trigger='Turn_res',
                                 source='Wait',
                                 dest='Turn',
                                 after='turn_table')
     self.scon = StageControl()
     self.rfnc = RecodeFunc()
     self.socl = SocketClient(host_ip, port_num, send_size, interval,
                              retry_times)
     self.mic_index, self.mic_channels = self.rfnc.get_index(
         'ReSpeaker 4 Mic Array (UAC1.0) ')
     # self.speak_wf, self.speak_stream, self.speak_p = self.rfnc.sound_read("./origin_sound_data/tsp_1num.wav")
     # self.speak_path = "../_exp/Speaker_Sound/1_plus005_4time.wav"
     self.speak_path = "../_exp/Speaker_Sound/2_up_tsp_8num.wav"
     self.mic_path = '../_exp/20' + datetime.today().strftime("%m%d") + '/recode_data/' + \
                     datetime.today().strftime("%H%M%S")
     self.rfnc.my_makedirs(self.mic_path)
     self.adjust = 50
Exemple #4
0
 def __init__(self, name, host_ip_1, host_ip_2, port_1, port_2, send_size, interval, retry_times):
     self.name = name
     self.machine = Machine(model=self, states=StateMachine.states, initial='Wait', auto_transitions=False)
     self.machine.add_transition(trigger='Turn_start', source='Init', dest='Turn', after='turn_table')
     self.machine.add_transition(trigger='Turn_fin', source='Turn', dest='Recode', before='recode')
     # self.machine.add_transition(trigger='Turn_fin', source='Init', dest='Recode', before='recode')
     self.machine.add_transition(trigger='Rec_fin', source='Recode', dest='Wait', after='wait')
     # self.machine.add_transition(trigger='Rec_fin', source='Recode', dest='Init', after='wait')
     self.machine.add_transition(trigger='Init_set', source='Wait', dest='Init', before='init')
     self.machine.add_transition(trigger='Turn_res', source='Wait', dest='Turn', after='turn_table')
     self.machine.add_transition(trigger='Next_dis', source='Wait', dest='Init', after='prepare_next')
     self.stage = StageControl()
     # self.rfnc = RecodeFunc()
     self.func = MyFunc()
     self.photo = TakePhoto()
     self.socket = SocketClient(host_ip_1, host_ip_2, port_1, port_2, send_size, interval, retry_times)
     # self.mic_index, self.mic_channels = self.rfnc.get_index('ReSpeaker 4 Mic Array (UAC1.0) ')
     # self.speak_wf, self.speak_stream, self.speak_p = self.rfnc.sound_read("./origin_sound_data/tsp_1num.wav")
     # self.speak_path = "../_exp/Speaker_Sound/1_plus005_4time.wav"
     self.speak_path = "../_exp/Speaker_Sound/2_up_tsp_8num.wav"
     self.mic_path = self.func.make_dir_path(exp=True)
     self.photo_path = self.func.make_dir_path(photo=True)
     # self.func.my_makedirs(self.mic_path)
     self.adjust = 50
 def __init__(self,
              name,
              path,
              host_ip_1,
              port_1,
              send_size,
              interval,
              retry_times,
              outfile="2_up_tsp_1num.wav"):
     super().__init__()
     self.mic_path = self.make_dir_path(exp=True)
     self.speak_path = self.speaker_sound_path + outfile
     self.recode_second = 1.2
     freq_min = 1000
     freq_max = 7000
     self.smooth_step = 50
     self.mic_id = 0
     self.scon = StageControl()
     # self.socket = SocketClient(host_ip_1, host_ip_2, port_1, port_2, send_size, interval, retry_times)
     self.socket = SocketClient(host_ip_1, port_1, send_size, interval,
                                retry_times)
     self.model = joblib.load(self.onedrive_path + '_array/' + path + name +
                              '.pkl')
     self.name = name
     origin_path = self.speaker_sound_path + '2_up_tsp_1num.wav'
     self.origin_frames = self.get_frames(origin_path)
     freq_list = np.fft.rfftfreq(self.get_frames(origin_path), 1 / 44100)
     self.freq_max_id = self.freq_ids(freq_list, freq_max)
     self.freq_min_id = self.freq_ids(freq_list, freq_min)
     self.freq_list = freq_list[self.freq_min_id +
                                int(self.smooth_step / 2) -
                                1:self.freq_max_id -
                                int(self.smooth_step / 2)]
     self.scon.calibrate()
     self.check_ready(200)
     self.socket.connect()
class StateMachine(object):
    states = ['Turn', 'Recode', 'Wait', 'Init', 'Next']

    def __init__(self, name, host_ip, port_num, send_size, interval,
                 retry_times):
        self.name = name
        self.machine = Machine(model=self,
                               states=StateMachine.states,
                               initial='Wait',
                               auto_transitions=False)
        self.machine.add_transition(trigger='Turn_start',
                                    source='Init',
                                    dest='Turn',
                                    after='turn_table')
        self.machine.add_transition(trigger='Turn_fin',
                                    source='Turn',
                                    dest='Recode',
                                    before='recode')
        # self.machine.add_transition(trigger='Turn_fin', source='Init', dest='Recode', before='recode')
        self.machine.add_transition(trigger='Rec_fin',
                                    source='Recode',
                                    dest='Wait',
                                    after='wait')
        # self.machine.add_transition(trigger='Rec_fin', source='Recode', dest='Init', after='wait')
        self.machine.add_transition(trigger='Init_set',
                                    source='Wait',
                                    dest='Init',
                                    before='init')
        self.machine.add_transition(trigger='Turn_res',
                                    source='Wait',
                                    dest='Turn',
                                    after='turn_table')
        self.scon = StageControl()
        self.rfnc = RecodeFunc()
        self.socl = SocketClient(host_ip, port_num, send_size, interval,
                                 retry_times)
        self.mic_index, self.mic_channels = self.rfnc.get_index(
            'ReSpeaker 4 Mic Array (UAC1.0) ')
        # self.speak_wf, self.speak_stream, self.speak_p = self.rfnc.sound_read("./origin_sound_data/tsp_1num.wav")
        # self.speak_path = "../_exp/Speaker_Sound/1_plus005_4time.wav"
        self.speak_path = "../_exp/Speaker_Sound/2_up_tsp_8num.wav"
        self.mic_path = '../_exp/20' + datetime.today().strftime("%m%d") + '/recode_data/' + \
                        datetime.today().strftime("%H%M%S")
        self.rfnc.my_makedirs(self.mic_path)
        self.adjust = 50

    def turn_table(self, name):
        print(name - self.adjust, "Setting ... ")
        # State.scon.gSend("D:1S5000F100000R600")
        self.scon.move_table(name)

    def wait(self, sleep_time=2):
        # print("wait")
        time.sleep(sleep_time)
        pass

    def recode(self, name, num=0):
        if self.socl.socket is not None:
            self.socl.send_GO(self.mic_path + '/' + str(name) + '.wav')

    def init(self):
        if self.scon.ser is None:
            return -1
        self.scon.calibrate()
        self.socl.connect()

    def check_ready(self, wait_count):
        count_num = 0
        print("Now Moving ...")
        while count_num < wait_count:
            count_num += 1
            if not self.scon.isReady():
                while True:
                    count_num += 1
                    if self.scon.isReady():
                        break
        print("Ready")

    def main(self, DIRECTIONS, num=0):
        self.Init_set()
        self.check_ready(200)
        # time.sleep(30)
        print("Finish Calibration of Turn Table")
        print("#################################################")
        self.Turn_start(DIRECTIONS[0] + self.adjust)
        for i, deg in enumerate(DIRECTIONS):
            self.check_ready(200)
            time.sleep(2)
            self.Turn_fin(deg, num)
            self.Rec_fin()
            print("******************************************")
            if i + 1 < len(DIRECTIONS):
                self.Turn_res(DIRECTIONS[i + 1] + self.adjust)
                print("OK")

        self.scon.move_table(0 + self.adjust)

    @staticmethod
    def make_dir(order):
        DIRECTIONS = [order]
        for i in range(10):
            order = [k - 1 for k in order]
            DIRECTIONS.append(order)
        DIRECTIONS = np.array(DIRECTIONS).reshape(1, -1)[0]
        # print(np.array(DIRECTIONS).reshape(1, -1)[0])
        return DIRECTIONS
Exemple #7
0
class StateMachine(object):
    states = ['Turn', 'Recode', 'Wait', 'Init', 'Next']

    def __init__(self, name, host_ip_1, host_ip_2, port_1, port_2, send_size, interval, retry_times):
        self.name = name
        self.machine = Machine(model=self, states=StateMachine.states, initial='Wait', auto_transitions=False)
        self.machine.add_transition(trigger='Turn_start', source='Init', dest='Turn', after='turn_table')
        self.machine.add_transition(trigger='Turn_fin', source='Turn', dest='Recode', before='recode')
        # self.machine.add_transition(trigger='Turn_fin', source='Init', dest='Recode', before='recode')
        self.machine.add_transition(trigger='Rec_fin', source='Recode', dest='Wait', after='wait')
        # self.machine.add_transition(trigger='Rec_fin', source='Recode', dest='Init', after='wait')
        self.machine.add_transition(trigger='Init_set', source='Wait', dest='Init', before='init')
        self.machine.add_transition(trigger='Turn_res', source='Wait', dest='Turn', after='turn_table')
        self.machine.add_transition(trigger='Next_dis', source='Wait', dest='Init', after='prepare_next')
        self.stage = StageControl()
        # self.rfnc = RecodeFunc()
        self.func = MyFunc()
        self.photo = TakePhoto()
        self.socket = SocketClient(host_ip_1, host_ip_2, port_1, port_2, send_size, interval, retry_times)
        # self.mic_index, self.mic_channels = self.rfnc.get_index('ReSpeaker 4 Mic Array (UAC1.0) ')
        # self.speak_wf, self.speak_stream, self.speak_p = self.rfnc.sound_read("./origin_sound_data/tsp_1num.wav")
        # self.speak_path = "../_exp/Speaker_Sound/1_plus005_4time.wav"
        self.speak_path = "../_exp/Speaker_Sound/2_up_tsp_8num.wav"
        self.mic_path = self.func.make_dir_path(exp=True)
        self.photo_path = self.func.make_dir_path(photo=True)
        # self.func.my_makedirs(self.mic_path)
        self.adjust = 50

    def turn_table(self, name):
        # State.scon.gSend("D:1S5000F100000R600")
        self.stage.move_table(name)
        print(name-self.adjust, ' [deg]')

    @staticmethod
    def wait(sleep_time=2):
        # print("wait")
        time.sleep(sleep_time)
        pass

    def recode(self, dir_name, dis_name):
        if self.socket.socket_1 is not None:
            self.photo.capture(self.photo_path + '/' + str(dis_name) + '/' + str(dir_name))
            self.socket.send_GO(self.mic_path + '/' + str(dis_name) + '/' + str(dir_name) + '.wav')

    def init(self):
        if self.stage.ser is None:
            return -1
        self.stage.calibrate()
        self.socket.connect()
        self.socket.send_INIT()

    def check_ready(self, wait_count):
        count_num = 0
        # print("Now Moving ...")
        while count_num < wait_count:
            count_num += 1
            if not self.stage.isReady():
                while True:
                    count_num += 1
                    if self.stage.isReady():
                        break
        # print("Ready")

    @staticmethod
    def prepare_next(dis):
        print("Finish ", str(dis), ' [m]')

    def main(self, directions, distances):
        self.Init_set()
        self.check_ready(200)
        # time.sleep(30)
        print("Finish Robot, Mic, Turn Table Set UP")
        print("#################################################")
        for j, dis in enumerate(distances):
            if j != 0:
                self.socket.send_SET_DIS(self.transform_pos_to_command(y_pos=round(distances[j-1]- dis, 2)))
            self.func.my_makedirs(self.mic_path + '/' + str(dis))
            self.func.my_makedirs(self.photo_path + '/' + str(dis))
            self.Turn_start(directions[0] + self.adjust)
            for i, deg in enumerate(directions):
                self.check_ready(200)
                time.sleep(2)
                self.Turn_fin(deg, dis)
                self.Rec_fin()
                # print("******************************************")
                if i + 1 < len(directions):
                    self.Turn_res(directions[i + 1] + self.adjust)
                    # print("OK")
                else:
                    self.Next_dis(dis)
        print()
        print('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^')
        self.socket_close()
        self.stage.move_table(0 + self.adjust)
        print('Finish Experiment (^^)/ !!')

    @staticmethod
    def make_dir(order_num):
        directions = [order_num]
        for i in range(4):
            order_num = [k - 1 for k in order_num]
            directions.append(order_num)
        directions = np.array(directions).reshape(1, -1)[0]
        directions = np.append(directions, -50)
        # print(np.array(DIRECTIONS).reshape(1, -1)[0])
        print(directions)
        return directions

    def socket_close(self):
        self.socket.close()
        print('Disconnect Socket Communication')

    @staticmethod
    def transform_pos_to_command(x_pos=0.0, y_pos=0.0, z_pos=0.0):
        if y_pos > 0:
            print('ERROR')
            sys.exit()
        else:
            return 'x=' + str(x_pos) + ',y=' + str(y_pos) + ',z=' + str(z_pos)
class StateMachine(object):
    states = ['Turn', 'Recode', 'Wait', 'Init', 'Next']

    def __init__(self, name):
        self.name = name
        self.machine = Machine(model=self,
                               states=StateMachine.states,
                               initial='Wait',
                               auto_transitions=False)
        self.machine.add_transition(trigger='Turn_start',
                                    source='Init',
                                    dest='Turn',
                                    after='turn_table')
        self.machine.add_transition(trigger='Turn_fin',
                                    source='Turn',
                                    dest='Recode',
                                    before='recode')
        self.machine.add_transition(trigger='Rec_fin',
                                    source='Recode',
                                    dest='Wait',
                                    after='wait')
        self.machine.add_transition(trigger='Init_set',
                                    source='Wait',
                                    dest='Init',
                                    before='init')
        self.machine.add_transition(trigger='Turn_res',
                                    source='Wait',
                                    dest='Turn',
                                    after='turn_table')
        self.machine.add_transition(trigger='Next_dis',
                                    source='Wait',
                                    dest='Init',
                                    after='prepare_next')
        self.stage = StageControl()
        self.func = MyFunc()
        self.photo = TakePhoto()
        self.photo_path = self.func.make_dir_path(photo=True)
        self.adjust = 50

    def turn_table(self, name):
        self.stage.move_table(name)
        print(name - self.adjust, ' [deg]')

    @staticmethod
    def wait(sleep_time=2):
        time.sleep(sleep_time)
        pass

    def recode(self, dir_name):
        # vapor switch on and take a photo
        self.photo.capture(self.photo_path + str(dir_name))
        # pass
        # if self.socket.socket_1 is not None:
        #     self.photo.capture(self.photo_path + '/' + str(dis_name) + '/' + str(dir_name))
        #     self.socket.send_GO(self.mic_path + '/' + str(dis_name) + '/' + str(dir_name) + '.wav')

    def init(self):
        if self.stage.ser is None:
            return -1
        self.stage.calibrate()

    def check_ready(self, wait_count):
        count_num = 0
        # print("Now Moving ...")
        while count_num < wait_count:
            count_num += 1
            if not self.stage.isReady():
                while True:
                    count_num += 1
                    if self.stage.isReady():
                        break
        # print("Ready")

    @staticmethod
    def prepare_next(dis):
        print("Finish ", str(dis), ' [m]')

    def main(self, directions, distances):
        self.Init_set()
        self.check_ready(200)
        # time.sleep(30)
        print("Finish Robot, Mic, Turn Table Set UP")
        print("#################################################")
        # self.func.my_makedirs(self.photo_path + '/' + str(dis))
        self.Turn_start(directions[0] + self.adjust)
        for i, deg in enumerate(directions):
            self.check_ready(200)
            time.sleep(2)
            self.Turn_fin(deg)
            self.Rec_fin()
            # print("******************************************")
            if i + 1 < len(directions):
                self.Turn_res(directions[i + 1] + self.adjust)
                # print("OK")
        print()
        print('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^')
        self.socket_close()
        self.stage.move_table(0 + self.adjust)
        print('Finish Experiment (^^)/ !!')

    @staticmethod
    def make_dir(order_num):
        directions = [order_num]
        for i in range(4):
            order_num = [k - 1 for k in order_num]
            directions.append(order_num)
        directions = np.array(directions).reshape(1, -1)[0]
        directions = np.append(directions, -50)
        # print(np.array(DIRECTIONS).reshape(1, -1)[0])
        print(directions)
        return directions

    def socket_close(self):
        # self.socket.close()
        print('Disconnect Socket Communication')

    @staticmethod
    def transform_pos_to_command(x_pos=0.0, y_pos=0.0, z_pos=0.0):
        if y_pos > 0:
            print('ERROR')
            sys.exit()
        else:
            return 'x=' + str(x_pos) + ',y=' + str(y_pos) + ',z=' + str(z_pos)
class Estimate(MyFunc):
    def __init__(self,
                 name,
                 path,
                 host_ip_1,
                 port_1,
                 send_size,
                 interval,
                 retry_times,
                 outfile="2_up_tsp_1num.wav"):
        super().__init__()
        self.mic_path = self.make_dir_path(exp=True)
        self.speak_path = self.speaker_sound_path + outfile
        self.recode_second = 1.2
        freq_min = 1000
        freq_max = 7000
        self.smooth_step = 50
        self.mic_id = 0
        self.scon = StageControl()
        # self.socket = SocketClient(host_ip_1, host_ip_2, port_1, port_2, send_size, interval, retry_times)
        self.socket = SocketClient(host_ip_1, port_1, send_size, interval,
                                   retry_times)
        self.model = joblib.load(self.onedrive_path + '_array/' + path + name +
                                 '.pkl')
        self.name = name
        origin_path = self.speaker_sound_path + '2_up_tsp_1num.wav'
        self.origin_frames = self.get_frames(origin_path)
        freq_list = np.fft.rfftfreq(self.get_frames(origin_path), 1 / 44100)
        self.freq_max_id = self.freq_ids(freq_list, freq_max)
        self.freq_min_id = self.freq_ids(freq_list, freq_min)
        self.freq_list = freq_list[self.freq_min_id +
                                   int(self.smooth_step / 2) -
                                   1:self.freq_max_id -
                                   int(self.smooth_step / 2)]
        self.scon.calibrate()
        self.check_ready(200)
        self.socket.connect()

    def estimate(self, dir_name):
        # recode_data, sampling = self.play_rec(self.speak_path, self.recode_second, device_name=self.mic_name,
        #                                       input_file_name=input_file, need_data=True)

        recode_data = self.socket.send_GO(self.mic_path + str(dir_name) +
                                          '.wav',
                                          return_data=True)
        print(recode_data.shape)
        start_time = self.zero_cross(recode_data,
                                     128,
                                     44100,
                                     512,
                                     self.origin_frames,
                                     up=True)
        if start_time < 0:
            start_time = 0
        sound_data = recode_data[:, start_time:int(start_time +
                                                   self.origin_frames)]
        # sound_data = np.reshape(sound_data, (8, 8, -1))
        print(sound_data.shape)
        # plt.figure()
        # plt.specgram(sound_data[0], Fs=44100)
        # plt.show()
        fft_data = np.fft.rfft(sound_data)
        print(fft_data.shape)
        data_set = np.zeros((recode_data.shape[0], len(self.freq_list)),
                            dtype=np.float)
        for mic in range(fft_data.shape[0]):
            smooth_data = np.convolve(
                np.abs(fft_data[mic, self.freq_min_id:self.freq_max_id]),
                np.ones(self.smooth_step) / float(self.smooth_step),
                mode='valid')
            smooth_data = np.real(np.reshape(smooth_data, (1, -1)))[0]
            normalize_data = stats.zscore(smooth_data, axis=0)
            # normalize_data = (smooth_data - smooth_data.mean()) / smooth_data.std()
            # normalize_data = (smooth_data - min(smooth_data))/(max(smooth_data) - min(smooth_data))
            data_set[mic, :] = normalize_data
        training_data = np.load(
            self.onedrive_path +
            '_array/200216/200210_PTs09_kuka_distance_200.npy')
        print(training_data.shape)

        plt.figure()
        plt.plot(training_data[dir_name + 50, 0, 0, :], label='model')
        plt.plot(data_set[0], label='measure')
        plt.legend()
        plt.show()
        print(self.model.predict(data_set))

    @staticmethod
    def freq_ids(freq_list, freq):
        freq_id = np.abs(freq_list - freq).argmin()
        return freq_id

    def turn_table(self, direction):
        self.scon.move_table(direction + 50)
        self.check_ready(200)
        time.sleep(2)
        print("move to ", direction)

    def check_ready(self, wait_count):
        count_num = 0
        print("Now Moving ...")
        while count_num < wait_count:
            count_num += 1
            if not self.scon.isReady():
                while True:
                    count_num += 1
                    if self.scon.isReady():
                        break
        print("Ready")
class Estimate(RecodeFunc):
    def __init__(self):
        self.mic_path = '../_exp/19' + datetime.today().strftime("%m%d") + '/recode_data/' + \
                        datetime.today().strftime("%H%M%S") + '/'
        self.my_makedirs(self.mic_path)
        # self.mic_index, self.mic_channels = self.get_index('ReSpeaker 4 Mic Array (UAC1.0) ')
        self.mic_name = 'ReSpeaker 4 Mic Array (UAC1.0) '
        self.speak_path = "../_exp/Speaker_Sound/2_up_tsp_1num.wav"
        self.recode_second = 1.2
        self.freq_min = 800
        self.freq_max = 2200
        self.smooth_step = 50
        self.mic_id = 0
        self.model = joblib.load('../../../../OneDrive/Research/_array/200212/svm_200210_PTs09_freq_1000_8000.pkl')
        self.scon = StageControl()
        self.scon.calibrate()
        self.check_ready(200)

    def estimate(self):
        input_file = self.mic_path + 'test.wav'
        recode_data, sampling = self.play_rec(self.speak_path, self.recode_second, device_name=self.mic_name,
                                              input_file_name=input_file, need_data=True)
        recode_data = np.delete(recode_data, [0, 5], 0)
        fft_data = np.fft.rfft(recode_data)
        freq_list = np.fft.rfftfreq(recode_data.shape[1], 1/sampling)
        freq_min_id = self.freq_ids(freq_list, self.freq_min)
        freq_max_id = self.freq_ids(freq_list, self.freq_max)
        data_set_freq_len = freq_max_id - freq_min_id - (self.smooth_step - 1)
        data_set = np.zeros((recode_data.shape[0], data_set_freq_len), dtype=np.float)
        for mic in range(fft_data.shape[0]):
            smooth_data = np.convolve(np.abs(fft_data[mic, freq_min_id:freq_max_id]),
                                      np.ones(self.smooth_step) / float(self.smooth_step), mode='valid')
            smooth_data = np.real(np.reshape(smooth_data, (1, -1)))[0]
            normalize_data = stats.zscore(smooth_data, axis=0)
            # normalize_data = (smooth_data - smooth_data.mean()) / smooth_data.std()
            # normalize_data = (smooth_data - min(smooth_data))/(max(smooth_data) - min(smooth_data))
            data_set[mic, :] = normalize_data
        # plt.figure()
        # plt.plot(data_set[self.mic_id, :])
        # plt.show()
        # print(data_set[self.mic_id].shape)
        print(self.model.predict(data_set[:, 256:]))

    @staticmethod
    def freq_ids(freq_list, freq):
        freq_id = np.abs(freq_list - freq).argmin()
        return freq_id

    def turn_table(self, direction):
        self.scon.move_table(direction + 50)
        self.check_ready(200)
        time.sleep(2)
        print("move to ", direction)

    def check_ready(self, wait_count):
        count_num = 0
        print("Now Moving ...")
        while count_num < wait_count:
            count_num += 1
            if not self.scon.isReady():
                while True:
                    count_num += 1
                    if self.scon.isReady():
                        break
        print("Ready")