예제 #1
0
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)
예제 #2
0
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
예제 #3
0
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)