| import gradio as gr |
| import numpy as np |
| import onnxruntime |
| import librosa |
| import os |
|
|
| |
| sess = onnxruntime.InferenceSession('weightsgru.onnx') |
|
|
| |
| utterance_length = 384 |
| def extract_mfcc(file_path, utterance_length): |
| """ |
| Extracts MFCC features from an audio file and pads/truncates them |
| to a fixed utterance length. |
| """ |
| try: |
| |
| raw_w, sampling_rate = librosa.load(file_path, sr=None) |
|
|
| |
| mfcc_features = librosa.feature.mfcc(y=raw_w, sr=sampling_rate, n_mfcc=40, hop_length=512) |
|
|
| |
| if mfcc_features.shape[1] > utterance_length: |
| mfcc_features_new = mfcc_features[:, :utterance_length] |
| else: |
| mfcc_features_new = np.pad( |
| mfcc_features, |
| ((0, 0), (0, utterance_length - mfcc_features.shape[1])), |
| mode='constant', |
| constant_values=0 |
| ) |
|
|
| |
| mfcc_features_new = mfcc_features_new.T |
| return mfcc_features_new |
| except Exception as e: |
| print(f"Error extracting MFCC: {e}") |
| return None |
|
|
| |
| def classify_audio(audio_file): |
| """ |
| Classifies an audio file of a bird call and returns the two most likely species. |
| """ |
| if audio_file is None: |
| return "Please upload an audio file.", "No second label." |
| |
| utterance_length = 384 |
| mfcc_features = extract_mfcc(audio_file, utterance_length) |
|
|
| if mfcc_features is None: |
| return "Error processing audio file.", "No second label." |
|
|
| |
| features = np.split(mfcc_features, 6) |
| inputs = [np.expand_dims(segment, axis=0) for segment in features] |
| classes = np.zeros((1, 10)) |
|
|
| |
| for input_data in inputs: |
| output = sess.run(None, {'gru_input': input_data.astype(np.float32)})[0] |
| classes += output |
|
|
| |
| pred_final1 = np.argmax(classes) |
| sorted_indices = np.argsort(classes.flatten()) |
| |
| |
| pred_final2 = sorted_indices[-2] |
|
|
| |
| bird_labels = { |
| 0: 'crow', 1: 'duck', 2: 'owl', 3: 'goaway', 4: 'peafowl', |
| 5: 'sparrow', 6: 'bluejay', 7: 'Asiankoel', 8: 'lapwing', 9: 'woodpeewe' |
| } |
| highest_bird_label = bird_labels[pred_final1] |
| second_highest_bird_label = bird_labels[pred_final2] |
|
|
| return highest_bird_label, second_highest_bird_label |
|
|
| |
| inputs = gr.Audio(type="filepath", label="Upload an audio file (.wav)") |
| |
| outputs = [ |
| gr.Textbox(label="Bird Label 1"), |
| gr.Textbox(label="Bird Label 2") |
| ] |
|
|
| interface = gr.Interface( |
| fn=classify_audio, |
| inputs=inputs, |
| outputs=outputs, |
| title="Multi-label Bird Call Identification from Field Recordings", |
| description="The multi-label bird call identification system is designed to classify 10 different bird species: House Crow, Mallard Duck, Eurasian Owl, Grey Go-away, Indian Peafowl, House Sparrow, Blue Jay, Asian Koel, Red Lapwing, and Western Wood Pewee. This system utilizes the MFCC-GRU model and is trained on data obtained from the Xeno-Canto bird sound database.", |
| css=""" |
| body { |
| background-color: #f0f8ff; /* Light sky blue background */ |
| } |
| .gradio-container { |
| background: linear-gradient(135deg, #e0f7fa, #b2ebf2); /* A nice gradient for the container */ |
| border-radius: 15px; |
| box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); |
| padding: 20px; |
| } |
| h1 { |
| color: #00796b; /* Dark cyan for the title */ |
| text-align: center; |
| } |
| .markdown-heading { |
| color: #004d40; /* Even darker shade for markdown headings */ |
| } |
| .gr-button { |
| background-color: #009688; /* Teal color for buttons */ |
| color: white; |
| border: none; |
| border-radius: 10px; |
| font-weight: bold; |
| transition: background-color 0.3s ease; |
| } |
| .gr-button:hover { |
| background-color: #00796b; /* Darker teal on hover */ |
| } |
| .gr-textbox { |
| background-color: #e0f2f1; /* Light cyan background for textboxes */ |
| border-radius: 10px; |
| border: 1px solid #b2dfdb; |
| } |
| """ |
| ) |
|
|
| |
| interface.launch() |
|
|