Sebastien Rousseau

Àkàndé: GPT-Powered Voice Assistant for Executives

একটি ওপেন-সোর্স Python ভয়েস অ্যাসিস্ট্যান্টের আর্কিটেকচার: Whisper, GPT-4, SQLite ক্যাশ এবং fpdf2

6 মিনিট পঠন
Banner for: Àkàndé: GPT-Powered Voice Assistant for Executives

নির্বাহী সারসংক্ষেপ / মূল বিষয়সমূহ

  • Àkàndé ⧉ হল একটি ওপেন-সোর্স Python ভয়েস অ্যাসিস্ট্যান্ট যা OpenAI Whisper স্পিচ-টু-টেক্সট, GPT-4 চ্যাট কমপ্লিশন, একটি স্থানীয় SQLite রেসপন্স ক্যাশ এবং fpdf2 PDF রপ্তানিকে একক ভয়েস-চালিত ওয়ার্কফ্লোতে সংযুক্ত করে — কোনো ক্লাউড স্টোরেজ এবং কোনো স্থানীয় AI মডেল ওজন ছাড়াই।
  • SQLite ক্যাশ নরমালাইজড কোয়েরি স্ট্রিংয়ের SHA-256 হ্যাশ র‍্যা API রেসপন্স টেক্সটে ম্যাপ করে সংরক্ষণ করে; ক্যাশ হিটে শূন্য টোকেন খরচ হয় এবং 10 ms এর কম সময়ে ফিরে আসে, পুনরাবৃত্তি কোয়েরিগুলি (যেমন মিটিংয়ের আগের একটি সিদ্ধান্ত পর্যালোচনা করা) মূলত বিনামূল্যে করে তোলে।
  • মাল্টি-টার্ন কথোপকথন messages তালিকা মেমরিতে তৈরি করে এবং প্রতিটি Chat Completions API কলে পাস করে বজায় রাখা হয় — মডেলটি পূর্ববর্তী বিনিময়ের উল্লেখ করতে সক্ষম হওয়ার জন্য সম্পূর্ণ সেশন ইতিহাস পায়, প্রতি টার্নে ক্রমবর্ধমান টোকেন ব্যবহারের মূল্যে।
  • PDF সারসংক্ষেপ জেনারেশন সেশনের messages তালিকাকে একটি ফর্ম্যাটেড fpdf2 ডকুমেন্টে সিরিয়ালাইজ করে: ব্যবহারকারীর এবং অ্যাসিস্ট্যান্টের টার্ন লেবেল করা হয়, টাইমস্ট্যাম্প সন্নিবেশিত হয় এবং স্বয়ংক্রিয় পেজিনেশন যেকোনো দৈর্ঘ্যের সেশন পরিচালনা করে; ফাইলটি স্থানীয় ফাইলসিস্টেমে লেখা হয়, আপলোড করা হয় না।
  • গোপনীয়তার সীমা: শুধুমাত্র লাইভ কোয়েরি (এবং প্রসঙ্গ উইন্ডোর সীমা পর্যন্ত সেশন ইতিহাস) ডিভাইস ছেড়ে যায় — কোনো অডিও রেকর্ডিং, ট্রান্সক্রিপ্ট এবং ক্যাশড রেসপন্স OpenAI এর API ছাড়া অন্য কোনো দূরবর্তী পরিষেবায় পাঠানো হয় না।

Àkàndé ⧉ হল একটি ওপেন-সোর্স Python ভয়েস অ্যাসিস্ট্যান্ট যা তিনটি সংযোজনযোগ্য উপাদানকে ঘিরে নির্মিত: স্পিচ রিকগনিশনের জন্য OpenAI Whisper, ভাষা বোঝার ও তৈরির জন্য GPT-4 Chat Completions API, এবং রেসপন্স ক্যাশিং ও সেশন ধারাবাহিকতার জন্য একটি স্থানীয় SQLite ডেটাবেস। ফলাফল হল একটি ভয়েস-চালিত ওয়ার্কফ্লো যা স্থানীয় মডেল ওজন, অফলাইন স্টোরেজ অবকাঠামো বা কন্টেইনার স্ট্যাক ছাড়াই ল্যাপটপে চালানো যায়।

এই নিবন্ধটি প্রতিটি উপাদানের প্রযুক্তিগত আর্কিটেকচার, ক্যাশিং এবং মাল্টি-টার্ন প্রসঙ্গ নিয়ে ডিজাইন সিদ্ধান্ত এবং PDF রপ্তানি পাইপলাইন বর্ণনা করে।

পাইপলাইনের সংক্ষিপ্ত বিবরণ #

একটি একক Àkàndé ইন্টারঅ্যাকশন এই ক্রম অনুসরণ করে:

  1. অডিও ক্যাপচার — ব্যবহারকারী কথা বলেন; অ্যাপ্লিকেশনটি sounddevice বা একটি সামঞ্জস্যপূর্ণ অডিও লাইব্রেরি ব্যবহার করে একটি অস্থায়ী WAV ফাইলে অডিও রেকর্ড করে।
  2. স্পিচ-টু-টেক্সট — WAV ফাইলটি openai.audio.transcriptions.create() (Whisper API)-তে জমা দেওয়া হয়; ট্রান্সক্রিপ্ট একটি সাদা স্ট্রিং হিসেবে ফেরত আসে।
  3. ক্যাশ লুকআপ — ট্রান্সক্রিপ্ট নরমালাইজড (লোয়ারকেস, হোয়াইটস্পেস-কোলাপসড) এবং SHA-256 হ্যাশ করা হয়; হ্যাশটি স্থানীয় SQLite response_cache টেবিলে খোঁজা হয়।
  4. API কল বা ক্যাশ হিট — মিস হলে, ট্রান্সক্রিপ্ট সেশনের messages তালিকায় যুক্ত করা হয় এবং openai.chat.completions.create()-এ পাঠানো হয়; রেসপন্স টেক্সট ক্যাশে সংরক্ষিত হয়।
  5. টেক্সট-টু-স্পিচ — রেসপন্স টেক্সট openai.audio.speech.create() এন্ডপয়েন্ট (TTS) বা একটি স্থানীয় TTS লাইব্রেরি ব্যবহার করে অডিওতে রূপান্তরিত হয় এবং বাজানো হয়।
  6. PDF রপ্তানি (চাহিদা অনুযায়ী) — সম্পূর্ণ messages তালিকা একটি ফর্ম্যাটেড fpdf2 ডকুমেন্টে সিরিয়ালাইজ করা হয় এবং ডিস্কে লেখা হয়।

OpenAI ইন্টিগ্রেশন: Chat Completions এবং Whisper #

Àkàndé স্পিচ রিকগনিশন এবং টেক্সট জেনারেশন উভয়ের জন্য openai Python SDK ব্যবহার করে। Whisper ট্রান্সক্রিপশন কল:

with open(audio_file_path, "rb") as f:
    transcript = openai.audio.transcriptions.create(
        model="whisper-1",
        file=f,
        language=None  # auto-detect
    )
user_text = transcript.text

Chat Completions কল একটি সেশন-স্কোপড messages তালিকা বজায় রাখে:

messages.append({"role": "user", "content": user_text})

response = openai.chat.completions.create(
    model="gpt-4-turbo-preview",
    messages=messages,
    temperature=0.2,
    max_tokens=1024
)

assistant_text = response.choices[0].message.content
messages.append({"role": "assistant", "content": assistant_text})

সিস্টেম প্রম্পট সেশন শুরুতে একবার যুক্ত করা হয় এবং Àkàndé এর পার্সোনা, আউটপুট ফর্ম্যাট এবং যেকোনো ডোমেন-নির্দিষ্ট বাধা নিয়ন্ত্রণ করে:

messages = [
    {
        "role": "system",
        "content": (
            "You are Àkàndé, a concise executive assistant. "
            "Respond in plain prose. Do not use markdown. "
            "If asked to summarise, produce three bullet points maximum."
        )
    }
]

temperature=0.2 সেট করা নির্ধারণবাদের জন্য সৃজনশীল বৈচিত্র্যের বিনিময় করে — সেশনের আগে নেওয়া সিদ্ধান্ত মনে করার মতো তথ্যভিত্তিক কোয়েরির জন্য গুরুত্বপূর্ণ।

SQLite রেসপন্স ক্যাশ #

ক্যাশ স্কিমা ন্যূনতম:

CREATE TABLE IF NOT EXISTS response_cache (
    query_hash  TEXT PRIMARY KEY,
    response    TEXT NOT NULL,
    created_at  INTEGER NOT NULL  -- Unix timestamp
);

লুকআপ এবং রাইট পাথ:

import hashlib, sqlite3, time

def _normalise(text: str) -> str:
    return " ".join(text.lower().split())

def cache_get(conn: sqlite3.Connection, query: str) -> str | None:
    h = hashlib.sha256(_normalise(query).encode()).hexdigest()
    row = conn.execute(
        "SELECT response FROM response_cache WHERE query_hash = ?", (h,)
    ).fetchone()
    return row[0] if row else None

def cache_set(conn: sqlite3.Connection, query: str, response: str) -> None:
    h = hashlib.sha256(_normalise(query).encode()).hexdigest()
    conn.execute(
        "INSERT OR REPLACE INTO response_cache VALUES (?, ?, ?)",
        (h, response, int(time.time()))
    )
    conn.commit()

INSERT OR REPLACE নিশ্চিত করে যে মডেল আপগ্রেডের পরে একই কোয়েরি জমা দেওয়া হলে ক্যাশড রেসপন্স আপডেট হয়। একটি TTL-ভিত্তিক ইভিকশন কোয়েরি (DELETE WHERE created_at < ?) ক্যাশ সাইজ সীমাবদ্ধ করতে স্টার্টআপে নির্ধারিত হতে পারে।

ক্যাশ হিট পারফরম্যান্স: স্থানীয় SSD-এ SQLite লুকআপ ~100,000 সারির টেবিলের জন্য 1 ms এর কম সময়ে ফিরে আসে। লাইভ GPT-4 API কলের রাউন্ড-ট্রিপ লেটেন্সি সাধারণত ছোট রেসপন্সের জন্য 600–900 ms। কিছু পুনরাবৃত্তি কোয়েরি সহ দৈনিক ব্রিফিংয়ের জন্য, ক্যাশ প্রথম সেশনের পরে বেশিরভাগ API কল দূর করে।

PDF সারসংক্ষেপ জেনারেশন #

PDF রপ্তানি fpdf2 ব্যবহার করে — কোনো বাইনারি নির্ভরতা ছাড়াই একটি রক্ষণাবেক্ষণকৃত Python PDF লাইব্রেরি:

from fpdf import FPDF
from datetime import datetime

def export_session_pdf(messages: list[dict], output_path: str) -> None:
    pdf = FPDF()
    pdf.add_page()
    pdf.set_font("Helvetica", size=11)
    pdf.set_margins(20, 20, 20)

    pdf.set_font("Helvetica", "B", 14)
    pdf.cell(0, 10, f"Àkàndé Session — {datetime.now():%Y-%m-%d %H:%M}", ln=True)
    pdf.ln(4)

    for msg in messages:
        if msg["role"] == "system":
            continue
        label = "You" if msg["role"] == "user" else "Àkàndé"
        pdf.set_font("Helvetica", "B", 10)
        pdf.cell(0, 6, label, ln=True)
        pdf.set_font("Helvetica", size=10)
        pdf.multi_cell(0, 5, msg["content"])
        pdf.ln(3)

    pdf.output(output_path)

multi_cell() লাইন-র‍্যাপিং এবং স্বয়ংক্রিয় পেজ ব্রেক পরিচালনা করে, তাই যেকোনো দৈর্ঘ্যের সেশন ম্যানুয়াল পেজিনেশন লজিক ছাড়াই একটি সুগঠিত ডকুমেন্ট তৈরি করে। আউটপুট হল একটি PDF/A-সামঞ্জস্যপূর্ণ ফাইল যাতে স্ট্যান্ডার্ড Helvetica মেট্রিক্সের বাইরে কোনো এমবেডেড ফন্ট নেই।

গোপনীয়তা মডেল #

Àkàndé-এ গোপনীয়তার সীমা তিনটি তথ্য দ্বারা সংজ্ঞায়িত:

  1. অডিও HTTPS-এর মাধ্যমে Whisper API-তে জমা দেওয়া হয় এবং API কলের বাইরে OpenAI দ্বারা রাখা হয় না (ফেব্রুয়ারি 2024 অনুযায়ী OpenAI-এর API ডেটা ব্যবহার নীতি অনুসারে)।
  2. Chat Completions API কলগুলি সেশনের messages তালিকা প্রেরণ করে — যা মাল্টি-টার্ন সেশনের জন্য সম্পূর্ণ কথোপকথনের ইতিহাস ধারণ করতে পারে।
  3. SQLite ডেটাবেস এবং PDF ফাইলগুলি সম্পূর্ণরূপে স্থানীয় ফাইলসিস্টেমে থাকে; কোনো ক্লাউড পরিষেবায় কোনো ব্যাকগ্রাউন্ড সিঙ্ক হয় না।

সংবেদনশীল বিষয় জড়িত নির্বাহী ব্যবহারের ক্ষেত্রে — M&A আলোচনা, কর্মী বিষয়, নিয়ন্ত্রক কৌশল — API-তে প্রেরিত সেশন ইতিহাস স্থাপনার আগে সংগঠনের AI ব্যবহার নীতির বিপরীতে পর্যালোচনা করা উচিত। সিস্টেম প্রম্পটের max_tokens সীমা উদ্দিষ্ট প্রকাশের সুযোগ ছাড়িয়ে যাওয়া প্রসঙ্গের অনিচ্ছাকৃত প্রেরণ রোধ করতে ব্যবহার করা যেতে পারে।

প্রায়শই জিজ্ঞাসিত প্রশ্নসমূহ #

সেশন শেষ হওয়ার পরে Àkàndé কি কথোপকথনের ইতিহাস ধরে রাখে? ইন-মেমরি messages তালিকা প্রক্রিয়া প্রস্থান করলে বাতিল হয়। কথোপকথনের ইতিহাস কেবল তখনই ধরে রাখা হয় যদি ব্যবহারকারী একটি PDF রপ্তানি ট্রিগার করেন বা একটি কাস্টম পার্সিস্টেন্স লেয়ার যোগ করা হয়। SQLite ক্যাশ কোয়েরি হ্যাশ এবং রেসপন্স টেক্সট সংরক্ষণ করে, সম্পূর্ণ কথোপকথনের প্রসঙ্গ নয়।

ক্যাশ কীভাবে অনুরূপ কিন্তু অভিন্ন নয় এমন কোয়েরি পরিচালনা করে? ক্যাশ নরমালাইজড কোয়েরি স্ট্রিংয়ে exact-match হ্যাশিং ব্যবহার করে। একটি শব্দে পার্থক্য থাকা দুটি কোয়েরি ভিন্ন হ্যাশ তৈরি করবে এবং পৃথক API কলে পরিণত হবে। সিমেন্টিক ক্যাশিং (প্রায় ডুপ্লিকেট কোয়েরি মেলানোর জন্য এমবেডিং সাদৃশ্য ব্যবহার করা) একটি অতিরিক্ত ভেক্টর লুকআপ পদক্ষেপের প্রয়োজন হবে এবং বেস ইমপ্লিমেন্টেশনের অংশ নয়।

Àkàndé ডিফল্টরূপে কোন GPT মডেল ব্যবহার করে? ফেব্রুয়ারি 2024 অনুযায়ী ডিফল্ট হল gpt-4-turbo-preview। মডেলের নাম একটি কনফিগারেশন প্যারামিটার, তাই যেকোনো OpenAI চ্যাট কমপ্লিশন মডেল প্রতিস্থাপিত করা যায়। gpt-3.5-turbo-তে স্যুইচ করলে প্রতি টোকেনে API খরচ প্রায় 20× কমে যায় কিন্তু জটিল মাল্টি-স্টেপ কোয়েরির জন্য যুক্তির মান কমে যায়।

PDF রপ্তানি ফর্ম্যাট কাস্টমাইজ করা যায়? হ্যাঁ। fpdf2 রপ্তানি ফাংশন messages তালিকাকে তার একমাত্র প্রয়োজনীয় ইনপুট হিসেবে গ্রহণ করে, তাই রপ্তানি ফাংশন সম্পাদনা করে ফন্ট, মার্জিন, পেজ সাইজ, হেডার কন্টেন্ট এবং লেবেলিং সব পরিবর্তন করা যায়। fpdf2 ছবি, টেবিল এবং Unicode ফন্ট যোগ করার সমর্থনও করে, নির্দিষ্ট ব্র্যান্ডিং প্রয়োজনীয়তা সহ সংগঠনগুলির জন্য সমৃদ্ধ ডকুমেন্ট লেআউট সম্ভব করে।

তথ্যসূত্র #

  1. OpenAI. Audio Transcriptions — Whisper API. OpenAI Platform Documentation, 2024. https://platform.openai.com/docs/api-reference/audio/createTranscription
  2. OpenAI. Chat Completions API. OpenAI Platform Documentation, 2024. https://platform.openai.com/docs/api-reference/chat/create
  3. Voss, J. এবং অন্যান্য. fpdf2: Modern PDF generation for Python. GitHub, 2024. https://github.com/py-pdf/fpdf2
  4. SQLite Consortium. SQLite Documentation. sqlite.org, 2024. https://www.sqlite.org/docs.html

সর্বশেষ পর্যালোচনা .

সর্বশেষ পর্যালোচনা .