File size: 2,482 Bytes
5b72506
 
 
 
 
 
 
 
 
 
91465cc
5b72506
 
 
 
 
 
 
91465cc
 
 
 
 
0845b4d
 
 
91465cc
0845b4d
91465cc
5b72506
 
0845b4d
5b72506
91465cc
0845b4d
 
91465cc
 
5b72506
0845b4d
 
 
 
 
 
 
5b72506
0845b4d
5b72506
 
 
91465cc
 
 
0845b4d
91465cc
0845b4d
91465cc
 
 
0845b4d
91465cc
5b72506
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import io
import os
import sqlite3
import wave
from datetime import datetime
from pydub import AudioSegment
import aiofiles
from .config import settings
from .database import get_connection


class AudioProcessor:
    def __init__(self):
        self.sessions = {}
        self.session_timings = {}
    
    async def save_audio_chunk(self, session_id: str, chunk_data: bytes, sequence: int, actual_duration_ms: float = None) -> str:
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        
        session_info = self.sessions.get(session_id, {})
        sura_number = session_info.get("sura_number")
        ayat_begin = session_info.get("ayat_begin")
        ayat_end = session_info.get("ayat_end")
        word_begin = session_info.get("word_begin")
        word_end = session_info.get("word_end")

        
        # Create filename
        filename = f"{session_id}_{sequence}_{timestamp}.wav"
        file_path = os.path.join(settings.AUDIO_STORAGE_DIR, filename)
        
        # Wrap raw PCM bytes into proper WAV
        sample_rate = session_info.get("sample_rate", settings.SAMPLE_RATE)
        channels = session_info.get("channels", settings.CHANNELS)
        bytes_per_sample = 2  # assuming 16-bit PCM

        total_samples = len(chunk_data) // (channels * bytes_per_sample)
        calculated_duration_ms = (total_samples / sample_rate) * 1000
        final_duration_ms = actual_duration_ms if actual_duration_ms is not None else calculated_duration_ms

        # Write WAV file properly
        with wave.open(file_path, 'wb') as wav_file:
            wav_file.setnchannels(channels)
            wav_file.setsampwidth(bytes_per_sample)
            wav_file.setframerate(sample_rate)
            wav_file.writeframes(chunk_data)
        
        # Insert into database
        conn = get_connection()
        cursor = conn.cursor()
        cursor.execute('''
            INSERT INTO audio_sessions (
                session_id, chunk_sequence, file_path, file_size, 
                duration_ms, actual_duration_ms, sura_number, 
                ayat_begin, ayat_end, word_begin,word_end
            )
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        ''', (
            session_id, sequence, file_path, len(chunk_data), 
            settings.CHUNK_DURATION_MS, final_duration_ms, 
            sura_number, ayat_begin, ayat_end, word_begin, word_end
        ))
        conn.commit()
        conn.close()
        
        return file_path