Merhaba arkadaşlar,
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:

  1. Sessizlik ve Gürültü Temizleme: Yüklenen ses dosyasındaki sessiz bölgeler ve gürültüler temizlenir.
  2. İnce Ayar Seçenekleri: Kullanıcılar sessizlik ve gürültü temizleme işlemini özelleştirebilir.
  3. MP3 Formatında Çıktı: İşlenen dosyalar MP3 formatında kaydedilir.
  4. 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 pydub
Aş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>&copy; 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>