def enrollment(enrollment_process_id, target_speaker_id): logging.info("Learning, id=%d", enrollment_process_id) try: enrollment_process = LearningProcess.objects.get( id=enrollment_process_id) except LearningProcess.DoesNotExist: logging.error("No such LearningProcess: %s", enrollment_process_id) return try: target_speaker = Speaker.objects.get(id=target_speaker_id) except Speaker.DoesNotExist: logging.error("No such speaker in DB: %s", target_speaker_id) return sample_files = enrollment_process.sample_filepath_iterator() try: if enrollment_process.retrain_model is None: dyn_settings = Settings.get_instance() model = enroll( sample_files, model_classname=settings.SPEAKER_MODEL_CLASSNAME, model_parameters=dyn_settings.speaker_model_parameters_dict) else: model = retrain_model(sample_files, enrollment_process.retrain_model) except NeedMoreDataError: logging.info("Need more data") enrollment_process.transition(enrollment_process.WAIT_FOR_DATA) except BaseException, e: log_exception(msg="Exception raised during enrollment:") enrollment_process.transition(enrollment_process.FAILED)
def enrollment_confirm(request): remote_addr = request.META['REMOTE_ADDR'] form = EnrollmentRequestForm(request.REQUEST, remote_ip=dotted_quad_to_num(remote_addr)) if form.is_valid(): # raises valid exceptions on errors # All validation done, so we need to verificate a session dyn_settings = Settings.get_instance() enrollment_process = form.cleaned_data['enrollment_process'] utterance_count = enrollment_process\ .sample_sessions\ .aggregate(count=Count('uploadedutterance')).get('count') assert utterance_count > dyn_settings.min_utterance_count_to_enroll,\ _("Need at least %(count)d utterance to enroll") % {'count': utterance_count} target_speakers = enrollment_process.sample_sessions.values_list( 'target_speaker').distinct() assert target_speakers.count() == 1, _( "More than one speaker tagged as target in sample sessions") target_speaker = target_speakers[0][0] assert request.user.id == target_speaker, _( "Enrollment can be confirmed only by original person") enrollment_process.transition(LearningProcess.STARTED) send_message("django_verispeak.enrollment", enrollment_process_id=enrollment_process.id, target_speaker_id=target_speaker) return _("Enrollment in progress") else: raise NotImplementedError
def verification(verification_process_id, speaker_model_id): logging.info("Verification process: %s; Speaker model: %s", verification_process_id, speaker_model_id) try: verification_process = VerificationProcess.objects.get( id=verification_process_id) except VerificationProcess.DoesNotExist: logging.error( "Wrong arguments to verification: no such VerificationProcess (id=%s)" % verification_process_id) return # fail silently try: speaker_model = SpeakerModel.objects.get(id=speaker_model_id) except SpeakerModel.DoesNotExist: verification_process.transition(verification_process.FAILED) return try: verificator = speaker_model.llr_verificator except: try: ubm = UniversalBackgroundModel.objects.latest() except: logging.error( "Can't determine verificator for speaker (UBM not found)") verification_process.transition(verification_process.FAILED) return else: dyn_settings = Settings.get_instance() verificator = LLRVerificator.objects.create( null_estimator=speaker_model, alternative_estimator=ubm, treshhold=dyn_settings.global_llr_threshold) # for now we have verificator and link to all uploaded utterances, # so we can verificate them try: logging.info("Trying to verificate record session %s.." % verification_process.target_session.pk) result, score = verificate(verification_process.target_session, verificator) except NeedMoreDataError: logging.info("Need more data") verification_process.transition(verification_process.WAIT_FOR_DATA) except BaseException, e: logging.error(u"Exception raised during scoring:", exc_info=1) verification_process.transition(verification_process.FAILED)