Bugün sizlerle Python kullanarak geliştirdiğim bir ses işleme uygulaması paylaşmak istiyorum. Bu uygulama, yüklenen ses dosyalarındaki sessizlikleri ve gürültüleri temizleyerek kaliteli bir ses dosyası elde etmenize olanak sağlar. Ayrıca, uygulama üzerinde bazı ince ayarlar yaparak işleme algoritmasını daha detaylı bir şekilde kontrol edebilirsiniz.
Geliştirilen Özellikler:
- Sessizlik ve Gürültü Temizleme: Yüklenen ses dosyasındaki sessiz bölgeler ve gürültüler temizlenir.
- İnce Ayar Seçenekleri: Kullanıcılar sessizlik ve gürültü temizleme işlemini özelleştirebilir.
- MP3 Formatında Çıktı: İşlenen dosyalar MP3 formatında kaydedilir.
- Güçlü Ses İşleme: webrtcvad kütüphanesi ile sesin hangi bölümlerinin konuşma içerdiği tespit edilip sadece konuşmalar saklanır.
Uygulamanın Özellikleri:
- Flask Web Arayüzü: Kullanıcı dostu bir arayüz ile dosya yükleme ve işleme yapılabilir.
- İnce Ayarlar: Sessizlik temizleme parametrelerini kullanıcılar ayarlayabilir.
- MP3 ve WAV Desteği: Uygulama MP3 ve WAV dosyalarını kabul eder ve çıktıyı MP3 formatında sunar.
Gerekli Kütüphaneler:
pip install flask librosa soundfile webrtcvad numpy pydubAşağıda Flask tabanlı ses işleme uygulamamın tam kodunu bulabilirsiniz:
app.py – Uygulamanın Ana Dosyası:
import os import numpy as np import librosa import soundfile as sf import webrtcvad from flask import Flask, request, render_template, send_from_directory, redirect, url_for from pydub import AudioSegment app = Flask(__name__) UPLOAD_FOLDER = 'uploads/' PROCESSED_FOLDER = 'processed/' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER app.config['PROCESSED_FOLDER'] = PROCESSED_FOLDER # Dizinlerin oluşturulması os.makedirs(UPLOAD_FOLDER, exist_ok=True) os.makedirs(PROCESSED_FOLDER, exist_ok=True) def remove_silence_and_noise(input_file, output_file, sample_rate=16000, aggressiveness=2, frame_duration=30): try: # Ses dosyasını yükle y, sr = librosa.load(input_file, sr=sample_rate) vad = webrtcvad.Vad(aggressiveness) y = (y * 32767).astype(np.int16) # Çerçeve boyutu frame_length = int(sample_rate * frame_duration / 1000) frames = [y[i:i + frame_length] for i in range(0, len(y), frame_length) if i + frame_length <= len(y)] voiced_frames = [] for frame in frames: try: is_speech = vad.is_speech(frame.tobytes(), sample_rate) if is_speech: voiced_frames.append(frame) except Exception as frame_error: print(f"Çerçeve işlenirken hata atlandı: {frame_error}") continue # Hatalı çerçeveyi atla output_audio = np.concatenate(voiced_frames) if voiced_frames else np.array([]) if output_audio.size > 0: # Geçici WAV dosyasını kaydet wav_path = output_file.replace('.mp3', '.wav') sf.write(wav_path, output_audio.astype(np.float32) / 32767, sample_rate) # WAV dosyasını MP3'e dönüştür audio_segment = AudioSegment.from_wav(wav_path) audio_segment.export(output_file, format='mp3') os.remove(wav_path) # Geçici WAV dosyasını sil else: raise ValueError("İşlenecek ses bulunamadı. Lütfen farklı bir dosya yükleyin.") except Exception as e: print(f"Ses işlenirken hata oluştu: {e}") raise ValueError(f"Ses işlenirken hata oluştu: {e}") @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': file = request.files['file'] if file and file.filename.endswith(('.wav', '.mp3')): input_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename) file.save(input_path) output_filename = f"processed_{file.filename.rsplit('.', 1)[0]}.mp3" # MP3 formatında çıktı adı output_path = os.path.join(app.config['PROCESSED_FOLDER'], output_filename) try: # Sessizlik ve gürültü temizleme remove_silence_and_noise(input_path, output_path) return redirect(url_for('play', filename=output_filename)) # Oynatma sayfasına yönlendirme except Exception as e: print(f"Hata: {e}") return "Bir hata oluştu. Lütfen farklı bir dosya deneyin." return render_template('index.html') @app.route('/download/<filename>') def download_file(filename): return send_from_directory(app.config['PROCESSED_FOLDER'], filename) @app.route('/play/<filename>') def play(filename): return render_template('play.html', filename=filename) if __name__ == '__main__': app.run(debug=True)index.html – Dosya Yükleme Sayfası:
<!DOCTYPE html> <html lang="tr"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Ses İşleme Uygulaması</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet"> <style> body { background-color: #f0f4f8; font-family: 'Roboto', sans-serif; } .container { margin-top: 50px; max-width: 600px; background-color: #ffffff; padding: 30px; border-radius: 15px; box-shadow: 0 8px 30px rgba(0, 0, 0, 0.1); transition: transform 0.2s; } .container:hover { transform: scale(1.02); } h1 { font-size: 2.5rem; margin-bottom: 20px; text-align: center; color: #343a40; font-weight: 700; } p { font-size: 1.1rem; margin-bottom: 20px; text-align: center; color: #495057; } .btn-primary { background-color: #007bff; border-color: #007bff; font-weight: bold; transition: background-color 0.3s; } .btn-primary:hover { background-color: #0056b3; border-color: #0056b3; } .form-group { margin-bottom: 25px; } .footer { margin-top: 30px; text-align: center; font-size: 0.9rem; color: #6c757d; } .footer a { color: #007bff; text-decoration: none; } .footer a:hover { text-decoration: underline; } @media (max-width: 576px) { h1 { font-size: 2rem; } .btn-primary { width: 100%; } } </style> </head> <body> <div class="container"> <h1>Ses İşleme Uygulaması</h1> <p>Gürültü ve sessiz yerleri kaldırmak için bir ses dosyası yükleyin.</p> <p><strong>Desteklenen formatlar:</strong> MP3, WAV</p> <form action="/" method="POST" enctype="multipart/form-data"> <div class="form-group"> <label for="file">Ses Dosyası Yükle:</label> <input type="file" class="form-control-file" id="file" name="file" accept=".mp3, .wav" required> </div> <div class="form-group"> <label for="aggressiveness">Gürültü Engelleme Agresifliği (0-3):</label> <input type="number" class="form-control" id="aggressiveness" name="aggressiveness" min="0" max="3" value="2" required> </div> <div class="form-group"> <label for="frame_duration">Kare Süresi (ms):</label> <input type="number" class="form-control" id="frame_duration" name="frame_duration" min="10" max="100" value="30" required> </div> <button type="submit" class="btn btn-primary btn-lg">Yükle ve İşle</button> </form> <div class="footer"> <p>© 2024 Ses İşleme Uygulaması. Tüm hakları saklıdır. <a href="https://www.example.com" target="_blank">Hakkında</a></p> </div> </div> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> </body> </html>play.html dosya kodu
<!DOCTYPE html> <html lang="tr"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Ses Oynatıcı</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap" rel="stylesheet"> <style> body { background-color: #f0f4f8; font-family: 'Roboto', sans-serif; } .container { margin-top: 50px; max-width: 600px; background-color: #ffffff; padding: 30px; border-radius: 15px; box-shadow: 0 8px 30px rgba(0, 0, 0, 0.1); } h1 { font-size: 2.5rem; margin-bottom: 20px; text-align: center; color: #343a40; } .audio-player { display: flex; flex-direction: column; align-items: center; } .btn-download { margin-top: 20px; } </style> </head> <body> <div class="container"> <h1>Ses Oynatıcı</h1> <div class="audio-player"> <audio controls> <source src="{{ url_for('download_file', filename=filename) }}" type="audio/mpeg"> Tarayıcınız audio etiketini desteklemiyor. </audio> <a href="{{ url_for('download_file', filename=filename) }}" class="btn btn-primary btn-lg btn-download">İndir</a> </div> </div> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script> </body> </html>