100 lines
3.0 KiB
Python
100 lines
3.0 KiB
Python
|
from flask import Flask, request, send_file, jsonify
|
||
|
import io
|
||
|
from scipy.io import wavfile
|
||
|
import numpy as np
|
||
|
import librosa
|
||
|
from Utils import ProceesAudio
|
||
|
import pyrebase
|
||
|
import soundfile as sf
|
||
|
import datetime
|
||
|
from flask_jwt_extended import JWTManager, jwt_required, create_access_token, get_jwt_identity
|
||
|
|
||
|
app = Flask(__name__)
|
||
|
app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024 # 16 MB limit
|
||
|
|
||
|
|
||
|
# Firebase configuration
|
||
|
firebase_config = {
|
||
|
"apiKey": "AIzaSyBqDZlqD7UOBvt2zsk9OLWKH1Lc3_f_VJM",
|
||
|
"authDomain": "modifier-4088b.firebaseapp.com",
|
||
|
"projectId": "modifier-4088b",
|
||
|
"storageBucket": "modifier-4088b.appspot.com",
|
||
|
"messagingSenderId": "237119475630",
|
||
|
"appId": "1:237119475630:web:6c96c38c61285f5fcb823f",
|
||
|
"measurementId": "G-6CWLQMT2Q3",
|
||
|
"databaseURL": "https://modifier-4088b.firebaseio.com",
|
||
|
}
|
||
|
|
||
|
firebase = pyrebase.initialize_app(firebase_config)
|
||
|
storage = firebase.storage()
|
||
|
|
||
|
@app.route('/process_and_upload', methods=['POST'])
|
||
|
|
||
|
def upload_to_firebase(processed_data, userId):
|
||
|
# Create an in-memory bytes buffer
|
||
|
buffer = io.BytesIO()
|
||
|
|
||
|
# Write processed data to the buffer as a WAV file
|
||
|
sf.write(buffer, processed_data, 44100, format='WAV')
|
||
|
buffer.seek(0) # Rewind the buffer
|
||
|
|
||
|
# Upload the buffer to Firebase Storage
|
||
|
storage_path = f'uploads/processed_audio_{userId}.wav'
|
||
|
storage.child(storage_path).put(buffer, f'processed_audio_{userId}.wav')
|
||
|
|
||
|
# Get the URL of the uploaded file
|
||
|
file_url = storage.child(storage_path).get_url(None)
|
||
|
|
||
|
return file_url
|
||
|
|
||
|
|
||
|
def int16_to_float32(samples):
|
||
|
return samples.astype(np.float32) / 32768.0
|
||
|
|
||
|
def process_audio_bytes(audio_bytes):
|
||
|
# Read the audio file from bytes
|
||
|
sample_rate, data = wavfile.read(io.BytesIO(audio_bytes))
|
||
|
left = []
|
||
|
right = []
|
||
|
for frame in data:
|
||
|
frame = int16_to_float32(frame)
|
||
|
left.append(frame[0])
|
||
|
right.append(frame[1])
|
||
|
data = np.array([left, right], dtype=np.float32)
|
||
|
|
||
|
pa = ProceesAudio()
|
||
|
|
||
|
processed_data = pa.perform_modulation(data=data, sr=sample_rate, index=0)
|
||
|
file_url = upload_to_firebase(processed_data=processed_data, userId="parth")
|
||
|
arr_to_show = []
|
||
|
|
||
|
acc_factor = int(len(processed_data)/150)
|
||
|
|
||
|
for i in range(0, len(processed_data), acc_factor):
|
||
|
arr_to_show.append(np.mean(np.abs(processed_data[i:i+acc_factor])))
|
||
|
|
||
|
for i in range(len(arr_to_show)):
|
||
|
arr_to_show[i] = float(arr_to_show[i])
|
||
|
|
||
|
return jsonify({"file_url": file_url, "array": arr_to_show})
|
||
|
|
||
|
@app.route('/modify', methods=['POST'])
|
||
|
def modify():
|
||
|
if 'song' not in request.files:
|
||
|
return 'No file part', 400
|
||
|
file = request.files['song']
|
||
|
if file.filename == '':
|
||
|
return 'No selected file', 400
|
||
|
if file:
|
||
|
# Read file bytes
|
||
|
file_bytes = file.read()
|
||
|
|
||
|
# Process the audio bytes
|
||
|
response = process_audio_bytes(file_bytes)
|
||
|
response.headers.add('Access-Control-Allow-Origin', '*')
|
||
|
return response
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
app.run(debug=True, port=8000)
|