def main()

in basic_pitch/predict.py [0:0]


def main() -> None:
    """Handle command line arguments. Entrypoint for this script."""
    parser = argparse.ArgumentParser(description="Predict midi from audio.")
    parser.add_argument("output_dir", type=str, help="directory to save outputs")
    parser.add_argument(
        "audio_paths",
        type=str,
        nargs="+",
        help="Space separated paths to the input audio files.",
    )
    parser.add_argument(
        "--model-path",
        type=str,
        default=ICASSP_2022_MODEL_PATH,
        help="path to the saved model directory. Defaults to a ICASSP 2022 model. "
        "The preferred model is determined by the first library available in "
        "[tensorflow, coreml, tensorflow-lite, onnx]",
    )
    parser.add_argument(
        "--model-serialization",
        type=str,
        choices=["tf", "coreml", "tflite", "onnx"],
        help="If used, --model-path is ignored and instead the model serialization type" "specified is used.",
    )
    parser.add_argument(
        "--save-midi",
        action="store_true",
        default=True,
        help="Create a MIDI file.",
    )
    parser.add_argument(
        "--sonify-midi",
        action="store_true",
        help="Create an audio .wav file which sonifies the MIDI outputs.",
    )
    parser.add_argument(
        "--save-model-outputs",
        action="store_true",
        help="Save the raw model output as an npz file.",
    )
    parser.add_argument(
        "--save-note-events",
        action="store_true",
        help="Save the predicted note events as a csv file.",
    )
    parser.add_argument(
        "--onset-threshold",
        type=float,
        default=0.5,
        help="The minimum likelihood for an onset to occur, between 0 and 1.",
    )
    parser.add_argument(
        "--frame-threshold",
        type=float,
        default=0.3,
        help="The minimum likelihood for a frame to sustain, between 0 and 1.",
    )
    parser.add_argument(
        "--minimum-note-length",
        type=float,
        default=127.70,
        help="The minimum allowed note length, in miliseconds.",
    )
    parser.add_argument(
        "--minimum-frequency",
        type=float,
        default=None,
        help="The minimum allowed note frequency, in Hz.",
    )
    parser.add_argument(
        "--maximum-frequency",
        type=float,
        default=None,
        help="The maximum allowed note frequency, in Hz.",
    )
    parser.add_argument(
        "--multiple-pitch-bends",
        action="store_true",
        help="Allow overlapping notes in midi file to have pitch bends. Note: this will map each "
        "pitch to its own instrument",
    )
    parser.add_argument(
        "--sonification-samplerate",
        type=int,
        default=44100,
        help="The samplerate for sonified audio files.",
    )
    parser.add_argument(
        "--midi-tempo",
        type=float,
        default=120,
        help="The tempo for the midi file.",
    )
    parser.add_argument(
        "--debug-file",
        default=None,
        help="Optional file for debug output for inference.",
    )
    parser.add_argument(
        "--no-melodia",
        default=False,
        action="store_true",
        help="Skip the melodia trick.",
    )
    args = parser.parse_args()

    print("")
    print("✨✨✨✨✨✨✨✨✨")
    print("✨ Basic Pitch  ✨")
    print("✨✨✨✨✨✨✨✨✨")
    print("")

    # tensorflow is very slow to import
    # this import is here so that the help messages print faster
    print("Importing the ML infrence library (this may take a few seconds)...")
    from basic_pitch.inference import (
        predict_and_save,
        verify_output_dir,
        verify_input_path,
    )

    output_dir = pathlib.Path(args.output_dir)
    verify_output_dir(output_dir)

    audio_path_list = [pathlib.Path(audio_path) for audio_path in args.audio_paths]
    for audio_path in audio_path_list:
        verify_input_path(audio_path)

    if args.model_serialization:
        model = Model(build_icassp_2022_model_path(FilenameSuffix[args.model_serialization]))
    else:
        model = Model(args.model_path)

    try:
        predict_and_save(
            audio_path_list,
            output_dir,
            args.save_midi,
            args.sonify_midi,
            args.save_model_outputs,
            args.save_note_events,
            model,
            args.onset_threshold,
            args.frame_threshold,
            args.minimum_note_length,
            args.minimum_frequency,
            args.maximum_frequency,
            args.multiple_pitch_bends,
            not args.no_melodia,
            pathlib.Path(args.debug_file) if args.debug_file else None,
            args.sonification_samplerate,
            args.midi_tempo,
        )
        print("\n✨ Done ✨\n")
    except IOError as ioe:
        print(ioe)
    except Exception as e:
        print("🚨 Something went wrong 😔 - see the traceback below for details.")
        print("")
        print(e)
        print(traceback.format_exc())