Ejemplo n.º 1
0
def upload_audio(upfile):  # noqa: E501
    """Uploads audio

     # noqa: E501

    :param upfile: File object that needs to be uploaded
    :type upfile: str

    :rtype: List[Audio]
    """

    filename = secure_filename(upfile.filename)
    filetype = get_filetype(filename)

    if filetype is None:
        return ('Invalid input', 405)

    db_audioresource = DB_AudioResource(name=filename)
    db.session.add(db_audioresource)
    db.session.commit()

    # cache file in local file system, then upload to MinIO
    if not os.path.exists(TEMP_UPLOAD_FOLDER):
        os.makedirs(TEMP_UPLOAD_FOLDER)

    local_file_path = os.path.join(TEMP_UPLOAD_FOLDER,
                                   str(db_audioresource.uuid))
    upfile.save(local_file_path)

    minio_file_path = str(db_audioresource.uuid)

    upload_result = upload_to_bucket(minio_client=minio_client,
                                     bucket=minio_buckets["DECODING_BUCKET"],
                                     filename=minio_file_path,
                                     file_path=local_file_path)

    # TODO: delete local file local_file_path

    if upload_result[0]:
        # TODO WRONG STATUS UNTIL AUDIO PREP WORKFLOW EXISTS
        db_audioresource.status = DB_AudioStateEnum.AudioPrep_Success
    else:
        db_audioresource.status = DB_AudioStateEnum.AudioPrep_Failure

    db.session.add(db_audioresource)
    db.session.commit()

    print('Uploaded audio file to MinIO: ' + str(db_audioresource))
    print(mapper.db_audio_to_front(db_audioresource))
    return (mapper.db_audio_to_front(db_audioresource), 201)
Ejemplo n.º 2
0
def get_all_audio():  # noqa: E501
    """Returns a list of available audio

     # noqa: E501


    :rtype: List[Audio]
    """
    audioresources = DB_AudioResource.query.all()
    audiolist = list()
    for ar in audioresources:
        audiolist.append(mapper.db_audio_to_front(ar))
    return audiolist
Ejemplo n.º 3
0
def get_decode_result(project_uuid, training_version,
                      audio_uuid):  # noqa: E501
    """Get the result of a decoding task

    Returns the result of a decoding task # noqa: E501

    :param project_uuid: UUID of the project
    :type project_uuid: 
    :param training_version: Training version of the project
    :type training_version: int
    :param audio_uuid: UUID of the audio
    :type audio_uuid: 

    :rtype: DecodeAudio
    """
    current_user = connexion.context['token_info']['user']

    db_project = DB_Project.query.filter_by(uuid=project_uuid,
                                            owner_id=current_user.id).first()

    if not db_project:
        return ('Project not found', 404)

    db_training = DB_Training.query.filter_by(version=training_version,
                                              project=db_project).first()

    if not db_training:
        return ('Training not found', 404)

    db_audio = DB_AudioResource.query.filter_by(uuid=audio_uuid).first()

    if not db_audio:
        return ('Audio not found', 404)

    db_decoding_audio = DB_DecodingAudio.query \
        .join(DB_Decoding, DB_Decoding.id == DB_DecodingAudio.decoding_id) \
        .filter(DB_Decoding.training_id == db_training.id) \
        .filter(DB_DecodingAudio.audioresource_id == db_audio.id) \
        .first()

    if not db_decoding_audio:
        return ('Decoding not found', 404)

    db_session = DB_Decoding.query.filter_by(
        id=db_decoding_audio.decoding_id).first()

    return DecodeAudio(transcripts=json.loads(db_decoding_audio.transcripts),
                       audio=mapper.db_audio_to_front(db_audio),
                       session_uuid=db_session.uuid)
Ejemplo n.º 4
0
def get_audio_by_uuid(audio_uuid):  # noqa: E501
    """Find audio by UUID

    Returns a single audio resource # noqa: E501

    :param audio_uuid: UUID of audio to return
    :type audio_uuid: str

    :rtype: Audio
    """
    audioresource = DB_AudioResource.query.filter_by(uuid=audio_uuid).first()

    if audioresource is None:
        return ("Audio not found", 404)

    return (mapper.db_audio_to_front(audioresource), 200)
Ejemplo n.º 5
0
def get_decodings(project_uuid, training_version):  # noqa: E501
    """List of all decodings

    Returns a list of all decodings for this training version # noqa: E501

    :param project_uuid: UUID of the project
    :type project_uuid: 
    :param training_version: Training version of the project
    :type training_version: int

    :rtype: List[DecodeAudio]
    """
    current_user = connexion.context['token_info']['user']

    db_project = DB_Project.query.filter_by(uuid=project_uuid,
                                            owner_id=current_user.id).first()

    if not db_project:
        return ('Project not found', 404)

    db_training = DB_Training.query.filter_by(version=training_version,
                                              project=db_project).first()

    if not db_training:
        return ('Training not found', 404)

    db_decoding_audios = DB_DecodingAudio.query \
        .join(DB_Decoding, DB_Decoding.id == DB_DecodingAudio.decoding_id) \
        .filter(DB_Decoding.training_id == db_training.id) \
        .all()

    decodings = list()
    for da in db_decoding_audios:
        db_session = DB_Decoding.query.filter_by(id=da.decoding_id).first()
        db_audio = DB_AudioResource.query.filter_by(
            id=da.audioresource_id).first()
        decodings.append(
            DecodeAudio(transcripts=json.loads(da.transcripts),
                        audio=mapper.db_audio_to_front(db_audio),
                        session_uuid=db_session.uuid))

    return decodings
Ejemplo n.º 6
0
def assign_audio_to_current_session(project_uuid,
                                    training_version,
                                    audio_reference_object=None):  # noqa: E501
    """Assign Audio to decoding session

    Assign audio to current decoding session # noqa: E501

    :param project_uuid: UUID of the project
    :type project_uuid: 
    :param training_version: Training version of the project
    :type training_version: int
    :param audio_reference_object: Audio that needs to be decoded
    :type audio_reference_object: dict | bytes

    :rtype: DecodeAudio
    """
    current_user = connexion.context['token_info']['user']

    if connexion.request.is_json:
        audio_reference_object = AudioReferenceObject.from_dict(
            connexion.request.get_json())  # noqa: E501

    # if user does not select file, browser also
    # submit an empty part without filename
    if audio_reference_object is None:
        return ('Invalid input', 405)

    db_project = DB_Project.query.filter_by(uuid=project_uuid,
                                            owner_id=current_user.id).first()

    if not db_project:
        return ('Project not found', 404)

    db_training = DB_Training.query.filter_by(version=training_version,
                                              project=db_project).first()

    if not db_training:
        return ('Training not found', 404)

    db_audioresource = DB_AudioResource.query.filter_by(
        uuid=audio_reference_object.audio_uuid).first()

    if not db_audioresource:
        return ("Audio Resouce not found", 404)

    db_decoding_audio = DB_DecodingAudio.query \
        .join(DB_Decoding, DB_Decoding.id == DB_DecodingAudio.decoding_id) \
        .filter(DB_Decoding.training_id == db_training.id) \
        .filter(DB_DecodingAudio.audioresource_id == db_audioresource.id) \
        .first()
    if db_decoding_audio:
        return ("Audio already in this training decoded", 400)

    #get current session or send error
    session = get_current_db_decode_session(db_project, db_training)
    if (session[1] != 200):
        return session
    db_session = session[0]

    db_decode_audio = DB_DecodingAudio(audioresource_id=db_audioresource.id,
                                       decoding_id=db_session.id)
    db.session.add(db_decode_audio)
    db.session.commit()

    return DecodeAudio(transcripts=json.loads(db_decode_audio.transcripts),
                       audio=mapper.db_audio_to_front(db_audioresource),
                       session_uuid=db_session.uuid)