Spaces:
Running
Running
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
|