PlusMagi's Blog By Pitt Phunsanit Database Whisper: เสียงกระซิบจาก video

Whisper: เสียงกระซิบจาก video

ในฐานะ System Specialist และ Senior Database Architect เราทราบดีว่า Whisper คือเครื่องมือที่ทรงพลังในการแปลงเสียงพูดจากวิดีโอให้เป็นข้อความ (Automatic Speech Recognition: ASR) อย่างไรก็ตาม ข้อมูลที่ได้จากการถอดเสียงนั้นไม่ได้เป็นเพียงแค่ตัวอักษร แต่คือข้อมูลที่มีโครงสร้างซับซ้อน ประกอบด้วยช่วงเวลา (Timestamps), ผู้พูด (Speaker ID), และเนื้อหา ซึ่งการจัดการและวิเคราะห์ข้อมูลเหล่านี้อย่างมีประสิทธิภาพจำเป็นต้องใช้ระบบฐานข้อมูลระดับสูง

บทความนี้จะเจาะลึกว่า PostgreSQL ด้วยคุณสมบัติขั้นสูง เช่น JSONB, Common Table Expressions (CTE) และฟังก์ชันเวลา สามารถทำหน้าที่เป็นศูนย์กลางในการจัดเก็บ จัดการ และวิเคราะห์ข้อมูล Transcript ที่ได้จาก Whisper ได้อย่างไร เพื่อให้เกิดประโยชน์สูงสุดในการนำไปใช้งานต่อ ไม่ว่าจะเป็นการวิเคราะห์อารมณ์ (Sentiment Analysis) หรือการติดตามการพูดของแต่ละบุคคล

🏗️ การออกแบบ Schema สำหรับข้อมูล Transcribe ด้วย PostgreSQL

เมื่อเราได้รับผลลัพธ์จาก Whisper ซึ่งมักจะเป็นชุดของข้อความพร้อมช่วงเวลา (Start Time, End Time) เราควรใช้โครงสร้างตารางที่รองรับการจัดเก็บข้อมูลกึ่งมีโครงสร้าง (Semi-structured data) เช่น JSONB เพื่อให้มีความยืดหยุ่นในการขยาย Schema ในอนาคต การออกแบบที่ดีควรแยกข้อมูลผู้พูด (Speakers) ออกจากข้อมูลการถอดเสียง (Segments) เพื่อให้เกิดการ Normalization

SQL

-- 1. ตารางเก็บข้อมูลผู้พูด (Speakers) เพื่อการอ้างอิง
CREATE TABLE speakers (
    speaker_id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    description TEXT
);

-- 2. ตารางเก็บส่วนของ Transcript (Segments)
CREATE TABLE transcription_segments (
    segment_id SERIAL PRIMARY KEY,
    video_file VARCHAR(255) NOT NULL,
    speaker_id INTEGER REFERENCES speakers(speaker_id),
    start_time TIMESTAMP WITH TIME ZONE NOT NULL,
    end_time TIMESTAMP WITH TIME ZONE NOT NULL,
    -- ใช้ JSONB เก็บข้อมูลรายละเอียดที่ซับซ้อน เช่น คำที่ถูกตัด (word-level details)
    whisper_details JSONB
);

-- ตัวอย่างการใส่ข้อมูล (Using short, clean data)
INSERT INTO speakers (name) VALUES ('Speaker A'), ('Speaker B');
INSERT INTO transcription_segments (video_file, speaker_id, start_time, end_time, whisper_details) VALUES 
('meeting_01.mp4', 1, '2023-10-26 10:00:00+07', '2023-10-26 00:00:05+07', '{"words": ["apple", "banana"]}'::jsonb),
('meeting_01.mp4', 2, '2023-10-26 10:00:05+07', '2023-10-26 00:00:10+07', '{"words": ["orange", "grape"]}'::jsonb);

💡 การวิเคราะห์ข้อมูลเชิงลึกด้วย Common Table Expressions (CTE)

พลังที่แท้จริงของ PostgreSQL คือความสามารถในการวิเคราะห์ข้อมูลที่จัดเก็บอย่างมีโครงสร้าง เราสามารถใช้ CTE เพื่อคำนวณช่วงเวลาการพูด (Speaking Turn) หรือหาว่าผู้พูดคนใดพูดนานที่สุดได้ โดยไม่ต้องเขียนโค้ดแอปพลิเคชันที่ซับซ้อน

SQL

WITH RankedSegments AS (
    SELECT
        segment_id,
        speaker_id,
        start_time,
        end_time,
        -- คำนวณความยาวของช่วงเวลาพูด
        EXTRACT(EPOCH FROM (end_time - start_time)) AS duration
    FROM transcription_segments
) 
-- ค้นหาว่าผู้พูดคนใดมีช่วงเวลาพูดรวมนานที่สุด
SELECT
    s.name AS speaker_name,
    SUM(rs.duration) AS total_speaking_time_seconds
FROM RankedSegments rs
JOIN speakers s ON rs.speaker_id = s.speaker_id
GROUP BY s.name
ORDER BY total_speaking_time_seconds DESC;

ผลลัพธ์ที่ได้คือการแปลงข้อมูลดิบ (Raw Data) ให้กลายเป็นข้อมูลเชิงลึก (Actionable Data) ที่พร้อมสำหรับการสร้าง Dashboard หรือระบบ AI ต่อไป

✅ บทสรุป: การผสานพลังของ ASR และ Relational Database

การใช้ Whisper เพียงอย่างเดียวให้ผลลัพธ์เป็นข้อความ แต่การผสาน Whisper เข้ากับ PostgreSQL ทำให้เราสามารถสร้างระบบที่สมบูรณ์แบบ ตั้งแต่การรับข้อมูล (Ingestion) การจัดเก็บ (Storage) ไปจนถึงการวิเคราะห์ (Analysis) ด้วยฟังก์ชันที่ทรงพลังอย่าง CTE และ JSONB

ด้วยการออกแบบ Schema ที่เหมาะสม การจัดการข้อมูล Transcript จึงไม่ใช่แค่การเก็บตัวอักษร แต่คือการสร้างฐานความรู้ที่สามารถวัดผลและนำไปใช้ในการพัฒนาแอปพลิเคชันระดับ Enterprise ได้อย่างแท้จริง