cari
Rumahpembangunan bahagian belakangTutorial PythonCara Membina Google NotebookLM anda sendiri

Dengan peningkatan populariti penggunaan kandungan audio, keupayaan untuk menukar dokumen atau kandungan bertulis anda kepada format audio yang realistik telah menjadi arah aliran baru-baru ini.

Walaupun NotebookLM Google telah mendapat perhatian dalam ruang ini, saya ingin meneroka membina sistem serupa menggunakan perkhidmatan awan moden. Dalam artikel ini, saya akan membimbing anda melalui cara saya mencipta sistem awan-asli berskala yang menukar dokumen kepada podcast berkualiti tinggi menggunakan FastAPI, Firebase, Google Cloud Pub/Sub dan perkhidmatan Text-to-Speech Azure.

Berikut ialah showcase yang anda boleh rujuk untuk keputusan sistem ini: MyPodify Showcase

Cabaran

Menukar dokumen kepada podcast tidak semudah menjalankan teks melalui enjin teks ke pertuturan. Ia memerlukan pemprosesan yang teliti, pemahaman bahasa semula jadi dan keupayaan untuk mengendalikan pelbagai format dokumen sambil mengekalkan pengalaman pengguna yang lancar. Sistem perlu:

  • Proses berbilang format dokumen dengan cekap
  • Jana audio bunyi semula jadi dengan berbilang suara
  • Kendalikan pemprosesan dokumen berskala besar tanpa menjejaskan pengalaman pengguna
  • Sediakan kemas kini status masa nyata kepada pengguna
  • Kekalkan ketersediaan dan kebolehskalaan yang tinggi

Architecture Deep Dive

Mari kita pecahkan komponen utama dan fahami cara ia berfungsi bersama:

How to Build your very own Google

1. Bahagian Belakang FastAPI

FastAPI berfungsi sebagai rangka kerja bahagian belakang kami, dipilih atas beberapa sebab yang menarik:

  • Sokongan Async: Dibina di atas Starlette, keupayaan async FastAPI membolehkan pengendalian permintaan serentak yang cekap
  • Dokumentasi OpenAPI Automatik: Menjana dokumentasi API interaktif di luar kotak
  • Keselamatan Jenis: Memanfaatkan pembayang jenis Python untuk pengesahan masa jalan
  • Prestasi Tinggi: Setanding dengan Node.js dan Go dari segi kelajuan

Berikut ialah pandangan terperinci pada titik akhir muat naik kami:

@app.post('/upload')
async def upload_files(
    token: Annotated[ParsedToken, Depends(verify_firebase_token)],
    project_name: str,
    description: str,
    website_link: str,
    host_count: int,
    files: Optional[List[UploadFile]] = File(None)
):
    # Validate token
    user_id = token['uid']

    # Generate unique identifiers
    project_id = str(uuid.uuid4())
    podcast_id = str(uuid.uuid4())

    # Process and store files
    file_urls = await process_uploads(files, user_id, project_id)

    # Create Firestore document
    await create_project_document(user_id, project_id, {
        'status': 'pending',
        'created_at': datetime.now(),
        'project_name': project_name,
        'description': description,
        'file_urls': file_urls
    })

    # Trigger async processing
    await publish_to_pubsub(user_id, project_id, podcast_id, file_urls)

    return {'project_id': project_id, 'status': 'processing'}

2. Penyepaduan Firebase

Firebase menyediakan dua perkhidmatan penting untuk aplikasi kami:

Storan Firebase

  • Mengendalikan muat naik fail selamat dengan penskalaan automatik
  • Menyediakan pengedaran bersandarkan CDN untuk fail audio yang dijana
  • Menyokong muat naik yang boleh disambung semula untuk fail besar

Firestore

  • Pangkalan data masa nyata untuk penjejakan status projek
  • Struktur berasaskan dokumen sesuai untuk metadata projek
  • Penskalaan automatik tanpa serpihan manual diperlukan

Begini cara kami melaksanakan kemas kini status masa nyata:

async def update_status(user_id: str, project_id: str, status: str, metadata: dict = None):
    doc_ref = db.collection('projects').document(f'{user_id}/{project_id}')

    update_data = {
        'status': status,
        'updated_at': datetime.now()
    }

    if metadata:
        update_data.update(metadata)

    await doc_ref.update(update_data)

3. Google Cloud Pub/Sub

Pub/Sub berfungsi sebagai tulang belakang pemesejan kami, membolehkan:

  • Seni bina yang dipisahkan untuk kebolehskalaan yang lebih baik
  • Jaminan penghantaran sekurang-kurangnya sekali
  • Pengekalan dan main semula mesej automatik
  • Barisan surat mati untuk mesej yang gagal

Contoh struktur mesej:

@app.post('/upload')
async def upload_files(
    token: Annotated[ParsedToken, Depends(verify_firebase_token)],
    project_name: str,
    description: str,
    website_link: str,
    host_count: int,
    files: Optional[List[UploadFile]] = File(None)
):
    # Validate token
    user_id = token['uid']

    # Generate unique identifiers
    project_id = str(uuid.uuid4())
    podcast_id = str(uuid.uuid4())

    # Process and store files
    file_urls = await process_uploads(files, user_id, project_id)

    # Create Firestore document
    await create_project_document(user_id, project_id, {
        'status': 'pending',
        'created_at': datetime.now(),
        'project_name': project_name,
        'description': description,
        'file_urls': file_urls
    })

    # Trigger async processing
    await publish_to_pubsub(user_id, project_id, podcast_id, file_urls)

    return {'project_id': project_id, 'status': 'processing'}

4. Penjanaan Suara dengan Perkhidmatan Pertuturan Azure

Inti penjanaan audio kami menggunakan SDK Pertuturan Perkhidmatan Kognitif Azure. Mari lihat cara kami melaksanakan sintesis suara yang berbunyi semula jadi:

async def update_status(user_id: str, project_id: str, status: str, metadata: dict = None):
    doc_ref = db.collection('projects').document(f'{user_id}/{project_id}')

    update_data = {
        'status': status,
        'updated_at': datetime.now()
    }

    if metadata:
        update_data.update(metadata)

    await doc_ref.update(update_data)

Salah satu ciri unik sistem kami ialah keupayaan untuk menjana podcast berbilang suara menggunakan AI. Begini cara kami mengendalikan penjanaan skrip untuk hos yang berbeza:

{
    'user_id': 'uid_123',
    'project_id': 'proj_456',
    'podcast_id': 'pod_789',
    'file_urls': ['gs://bucket/file1.pdf'],
    'description': 'Technical blog post about cloud architecture',
    'host_count': 2,
    'action': 'CREATE_PROJECT'
}

Untuk sintesis suara, kami memetakan pembesar suara yang berbeza kepada suara Azure tertentu:

import azure.cognitiveservices.speech as speechsdk
from pathlib import Path

class SpeechGenerator:
    def __init__(self):
        self.speech_config = speechsdk.SpeechConfig(
            subscription=os.getenv("AZURE_SPEECH_KEY"),
            region=os.getenv("AZURE_SPEECH_REGION")
        )

    async def create_speech_segment(self, text, voice, output_file):
        try:
            self.speech_config.speech_synthesis_voice_name = voice
            synthesizer = speechsdk.SpeechSynthesizer(
                speech_config=self.speech_config,
                audio_config=None
            )

            # Generate speech from text
            result = synthesizer.speak_text_async(text).get()

            if result.reason == speechsdk.ResultReason.SynthesizingAudioCompleted:
                with open(output_file, "wb") as audio_file:
                    audio_file.write(result.audio_data)
                return True

            return False

        except Exception as e:
            logger.error(f"Speech synthesis failed: {str(e)}")
            return False

5. Pekerja Pemprosesan Latar Belakang

Komponen pekerja mengendalikan pengangkatan berat:

  1. Analisis Dokumen

    • Ekstrak teks daripada pelbagai format dokumen
    • Analisis struktur dan kandungan dokumen
    • Kenal pasti topik dan bahagian utama
  2. Pemprosesan Kandungan

    • Jana aliran perbualan semula jadi
    • Pisah kandungan kepada segmen pembesar suara
    • Buat peralihan antara topik
  3. Penjanaan Audio

    • Tukar teks kepada pertuturan menggunakan suara saraf Azure
    • Kendalikan berbilang suara pembesar suara
    • Gunakan pemprosesan pasca audio

Berikut ialah pandangan ringkas tentang logik pekerja kami:

async def generate_podcast_script(outline: str, analysis: str, host_count: int):
    # System instructions for different podcast formats
    system_instructions = TWO_HOST_SYSTEM_PROMPT if host_count > 1 else ONE_HOST_SYSTEM_PROMPT

    # Example of how we structure the AI conversation
    if host_count > 1:
        script_format = """
        **Alex**: "Hello and welcome to MyPodify! I'm your host Alex, joined by..."
        **Jane**: "Hi everyone! I'm Jane, and today we're diving into {topic}..."
        """
    else:
        script_format = """
        **Alex**: "Welcome to MyPodify! Today we're exploring {topic}..."
        """

    # Generate the complete script using AI
    script = await generate_content_from_openai(
        content=f"{outline}\n\nContent Details:{analysis}",
        system_instructions=system_instructions,
        purpose="Podcast Script"
    )

    return script

Pengendalian Ralat dan Kebolehpercayaan

Sistem melaksanakan pengendalian ralat menyeluruh:

  1. Cuba semula Logik

    • Penyingkiran eksponen untuk panggilan API yang gagal
    • Konfigurasi percubaan cuba semula maksimum
    • Barisan surat mati untuk mesej gagal
  2. Penjejakan Status

    • Mesej ralat terperinci disimpan dalam Firestore
    • Kemas kini status masa nyata kepada pengguna
    • Ralat pengagregatan untuk pemantauan
  3. Pembersihan Sumber

    • Pemadaman fail sementara automatik
    • Pembersihan muat naik yang gagal
    • Pengesanan sumber yatim piatu

Penskalaan dan Pengoptimuman Prestasi

Untuk mengendalikan beban pengeluaran, kami telah melaksanakan beberapa pengoptimuman:

  1. Penskalaan Pekerja

    • Penskalaan mendatar berdasarkan panjang baris gilir
    • Penskalaan automatik berasaskan sumber
    • Pengaturan serantau untuk kependaman yang lebih rendah
  2. Pengoptimuman Storan

    • Penyahduplikasi kandungan
    • Storan audio termampat
    • Penyepaduan CDN untuk penghantaran
  3. Pengoptimuman Pemprosesan

    • Pemprosesan kelompok untuk dokumen yang serupa
    • Caching untuk kandungan berulang
    • Pemprosesan selari jika boleh

Pemantauan dan Kebolehmerhatian

Sistem ini termasuk pemantauan menyeluruh:

@app.post('/upload')
async def upload_files(
    token: Annotated[ParsedToken, Depends(verify_firebase_token)],
    project_name: str,
    description: str,
    website_link: str,
    host_count: int,
    files: Optional[List[UploadFile]] = File(None)
):
    # Validate token
    user_id = token['uid']

    # Generate unique identifiers
    project_id = str(uuid.uuid4())
    podcast_id = str(uuid.uuid4())

    # Process and store files
    file_urls = await process_uploads(files, user_id, project_id)

    # Create Firestore document
    await create_project_document(user_id, project_id, {
        'status': 'pending',
        'created_at': datetime.now(),
        'project_name': project_name,
        'description': description,
        'file_urls': file_urls
    })

    # Trigger async processing
    await publish_to_pubsub(user_id, project_id, podcast_id, file_urls)

    return {'project_id': project_id, 'status': 'processing'}

Penambahbaikan Masa Depan

Walaupun sistem semasa berfungsi dengan baik, terdapat beberapa kemungkinan menarik untuk penambahbaikan pada masa hadapan:

  1. Pemprosesan Audio Dipertingkat

    • Penyatuan muzik latar belakang
    • Kesan audio lanjutan
    • Latihan suara tersuai
  2. Peningkatan Kandungan

    • Penanda bab automatik
    • Transkrip interaktif
    • Sokongan berbilang bahasa
  3. Penyatuan Platform

    • Penerbitan platform podcast langsung
    • Penjanaan suapan RSS
    • Perkongsian media sosial

Membina penukar dokumen-ke-podcast telah menjadi satu perjalanan yang menarik ke dalam seni bina awan moden. Gabungan perkhidmatan FastAPI, Firebase, Google Cloud Pub/Sub dan Azure's Text-to-Speech menyediakan asas yang kukuh untuk mengendalikan pemprosesan dokumen yang kompleks pada skala.

Seni bina dipacu peristiwa memastikan sistem kekal responsif di bawah beban, manakala penggunaan perkhidmatan terurus mengurangkan overhed operasi. Sama ada anda sedang membina sistem yang serupa atau hanya meneroka seni bina asli awan, saya harap penyelaman mendalam ini telah memberikan cerapan berharga dalam membina aplikasi yang boleh skala dan sedia pengeluaran.


Ingin mengetahui lebih lanjut tentang seni bina awan dan pembangunan aplikasi moden? Ikuti saya untuk lebih banyak tutorial teknikal dan praktikal.

Atas ialah kandungan terperinci Cara Membina Google NotebookLM anda sendiri. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Menyenaraikan senarai di Python: Memilih kaedah yang betulMenyenaraikan senarai di Python: Memilih kaedah yang betulMay 14, 2025 am 12:11 AM

Tomergelistsinpython, operator youCanusethe, extendmethod, listcomprehension, oritertools.chain, eachwithspecificadvantages: 1) operatorSimpleButlessefficientficorlargelists;

Bagaimana untuk menggabungkan dua senarai dalam Python 3?Bagaimana untuk menggabungkan dua senarai dalam Python 3?May 14, 2025 am 12:09 AM

Dalam Python 3, dua senarai boleh disambungkan melalui pelbagai kaedah: 1) Pengendali penggunaan, yang sesuai untuk senarai kecil, tetapi tidak cekap untuk senarai besar; 2) Gunakan kaedah Extend, yang sesuai untuk senarai besar, dengan kecekapan memori yang tinggi, tetapi akan mengubah suai senarai asal; 3) menggunakan * pengendali, yang sesuai untuk menggabungkan pelbagai senarai, tanpa mengubah suai senarai asal; 4) Gunakan itertools.chain, yang sesuai untuk set data yang besar, dengan kecekapan memori yang tinggi.

Rentetan senarai concatenate pythonRentetan senarai concatenate pythonMay 14, 2025 am 12:08 AM

Menggunakan kaedah Join () adalah cara yang paling berkesan untuk menyambungkan rentetan dari senarai di Python. 1) Gunakan kaedah Join () untuk menjadi cekap dan mudah dibaca. 2) Kitaran menggunakan pengendali tidak cekap untuk senarai besar. 3) Gabungan pemahaman senarai dan menyertai () sesuai untuk senario yang memerlukan penukaran. 4) Kaedah mengurangkan () sesuai untuk jenis pengurangan lain, tetapi tidak cekap untuk penyambungan rentetan. Kalimat lengkap berakhir.

Pelaksanaan Python, apa itu?Pelaksanaan Python, apa itu?May 14, 2025 am 12:06 AM

PythonexecutionistheprocessoftransformingpythoncodeIntoExecutableInstructions.1) TheinterpreterreadsTheCode, convertingIntoByteCode, yang mana -mana

Python: Apakah ciri -ciri utamaPython: Apakah ciri -ciri utamaMay 14, 2025 am 12:02 AM

Ciri -ciri utama Python termasuk: 1. Sintaks adalah ringkas dan mudah difahami, sesuai untuk pemula; 2. Sistem jenis dinamik, meningkatkan kelajuan pembangunan; 3. Perpustakaan standard yang kaya, menyokong pelbagai tugas; 4. Komuniti dan ekosistem yang kuat, memberikan sokongan yang luas; 5. Tafsiran, sesuai untuk skrip dan prototaip cepat; 6. Sokongan multi-paradigma, sesuai untuk pelbagai gaya pengaturcaraan.

Python: pengkompil atau penterjemah?Python: pengkompil atau penterjemah?May 13, 2025 am 12:10 AM

Python adalah bahasa yang ditafsirkan, tetapi ia juga termasuk proses penyusunan. 1) Kod python pertama kali disusun ke dalam bytecode. 2) Bytecode ditafsirkan dan dilaksanakan oleh mesin maya Python. 3) Mekanisme hibrid ini menjadikan python fleksibel dan cekap, tetapi tidak secepat bahasa yang disusun sepenuhnya.

Python untuk gelung vs semasa gelung: Bila menggunakan yang mana?Python untuk gelung vs semasa gelung: Bila menggunakan yang mana?May 13, 2025 am 12:07 AM

UseAforLoopWheniteratingOvereForforpecificNumbimes; Useaphileloopwhencontinuinguntilaconditionismet.forloopsareidealforknownownsequences, sementara yang tidak digunakan.

Gelung Python: Kesalahan yang paling biasaGelung Python: Kesalahan yang paling biasaMay 13, 2025 am 12:07 AM

Pythonloopscanleadtoerrorslikeinfiniteloops, pengubahsuaianListsduringiteration, off-by-oneerrors, sifar-indexingissues, andnestedloopinefficies.toavoidthese: 1) use'i

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Nordhold: Sistem Fusion, dijelaskan
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.