من به شما کمک می کنم با هوش مصنوعی از من سؤال کنید
همانطور که در پست دیگرم اشاره کردم، برخی از ویژگیهای بسیار جالب مبتنی بر هوش مصنوعی را به kentcdodds.com اضافه کردهام و میخواهم همه چیز را به شما بگویم.
اگر نمی دانید، از زمانی که این سایت در سال 2021 راه اندازی شد، من پادکست Call Kent را معرفی کرده ام که در آن به سؤالات جامعه پاسخ می دهم. تا کنون بیش از 200 قسمت ضبط و ارسال شده است.
روش کار این است (همانطور که در ادامه توضیح داده شد /calls):
شما سؤال کوتاه خود (120 ثانیه یا کمتر) را مستقیماً از مرورگر خود ضبط می کنید. سپس بعداً گوش می دهم و پاسخ خود را می دهم و از طریق جادوی فناوری (ffmpeg) سؤال و پاسخ ما ادغام شده و در پادکست قرار می گیرد.
یکی دیگر از آیتمهای فهرست آرزوهایی که برای مدتی داشتم این است که افراد بدون نیاز به ثبتنام از من سؤال بپرسند یا موضوعات بحث را باز کنند.
فکر میکنم برخی از افراد از ثبتنام میترسند زیرا انگلیسی زبان اول آنها نیست، یا نگران کیفیت صدای خود هستند، نگران قضاوت شدن هستند، یا میخواهند زمان بیشتری برای فکر کردن در مورد سؤال خود و مرتب کردن افکار خود داشته باشند. همچنین، برخی افراد فقط میخواهند ناشناس باشند و نام یا صدایشان با این موضوع مرتبط نباشد.
بنابراین (به لطف عوامل ساخت شگفت انگیز و پلتفرم هوش مصنوعی Cloudflare)، همه این کارها و موارد دیگر را انجام داده ام!
حالا وقتی به /calls/record، همچنان میتوانید خودتان را ضبط کنید (با انیمیشن شکل موج عالی، HT Jhey)، اما همچنین یک دکمه کوچک برای تغییر به ورودی متن برای وارد کردن سؤال خود خواهید داشت. شما می توانید یک صدای هوش مصنوعی را برای استفاده از سؤال خود انتخاب کنید، و از آن صدا برای تولید صدای سؤال یا موضوع بحث شما استفاده می شود!
عالیه امتحانش کن!!
اوه، و هنگامی که رای خود را انتخاب کردید (یا ثبت نام کردید)، همچنین می توانید انتخاب کنید که آیا می خواهید ناشناس باشید یا نه. اگر میخواهید ناشناس باشید، میتوانید به سادگی روی کادر انتخاب «ناشناس» کلیک کنید و جلد قسمت از یک آواتار عمومی Kody به جای عکس شما استفاده میکند.
اما این همه ماجرا نیست! من به نوبه خود می توانم به صدای شما گوش دهم، پاسخ خود را ضبط کنم و سپس رونوشت و ابرداده مکالمه ما به طور خودکار برای من تولید می شود (اگر بخواهم می توانم آن را ویرایش کنم). این باعث می شود قسمت حاصل برای همه مفیدتر باشد و در وقت من صرفه جویی زیادی کند.
در اینجا معماری جریان تماس گیرنده تبدیل متن به گفتار است /calls/record:
این مسیر قبل از فراخوانی Workers AI چند کار مهم را انجام می دهد:
- متن سوال + انتخاب صوتی را تأیید می کند
- پیشوند آشکار هوش مصنوعی را اضافه می کند (در صورت عدم وجود)
سپس Workers AI را از طریق Cloudflare AI Gateway فراخوانی می کند:
export const AI_VOICE_DISCLOSURE_PREFIX = `This caller's voice was generated by AI.`
// Cloudflare AI Gateway -> Workers AI:
// https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/workers-ai/{model}
const generated = await synthesizeSpeechWithWorkersAi({
text: withAiDisclosurePrefix(questionText.trim()),
voice: selectedVoice,
model: getEnv().CLOUDFLARE_AI_TEXT_TO_SPEECH_MODEL, // I'm using `@cf/openai/deepgram/aura-2-en`,
})
پس از نوشتن پاسخ در رابط کاربری مدیریت، سرور یک خط لوله پردازش پیشنویس پسزمینه را شروع میکند:
مسیر کد داخل است startCallKentEpisodeDraftProcessingو به روز رسانی الف step فیلد به شرح زیر
await prisma.callKentEpisodeDraft.updateMany({
where: { id: draftId, status: 'PROCESSING' },
data: { step: 'GENERATING_AUDIO', errorMessage: null },
})
// createEpisodeAudio(...) + putEpisodeDraftAudioFromBuffer(...)
await prisma.callKentEpisodeDraft.updateMany({
where: { id: draftId, status: 'PROCESSING' },
data: { step: 'TRANSCRIBING', errorMessage: null },
})
// transcribeMp3WithWorkersAi(...) + formatCallKentTranscriptWithWorkersAi(...)
await prisma.callKentEpisodeDraft.updateMany({
where: { id: draftId, status: 'PROCESSING' },
data: { step: 'GENERATING_METADATA', errorMessage: null },
})
// generateCallKentEpisodeMetadataWithWorkersAi(...)
await prisma.callKentEpisodeDraft.updateMany({
where: { id: draftId, status: 'PROCESSING' },
data: { status: 'READY', step: 'DONE' },
})
و این همان قسمتی است که ffmpeg در واقع برای دوخت / عادی سازی کار می کند:
const responseAudio = parseBase64DataUrl(responseBase64).buffer
const created = await createEpisodeAudio(callAudio, responseAudio)
// In createEpisodeAudio(...)
const args = [
'-i', introPath,
'-i', callPath,
'-i', interstitialPath,
'-i', responsePath,
'-i', outroPath,
'-filter_complex', '...silenceremove + loudnorm + acrossfade...',
]
spawn('ffmpeg', args, { stdio: 'inherit' })
یکی از جزئیات پیاده سازی که ارزش توجه را دارد: فرم مدیریت یک پاسخ صوتی را به عنوان URL داده base64 ارسال می کند (responseBase64) و برای @cf/openai/whisper-large-v3-turbo مدل پایانی رونویسی هوش مصنوعی Workers، base64 را در JSON انتظار دارد. در کد:
const isWhisperLargeV3Turbo = model.includes('whisper-large-v3-turbo')
const body = isWhisperLargeV3Turbo
? JSON.stringify({
// `whisper-large-v3-turbo` expects base64 in the JSON payload.
audio: Buffer.from(mp3Body).toString('base64'),
language: 'en',
vad_filter: true,
})
: mp3Body
برای @cf/openai/whisper (غیر توربو)، باینری خام audio/mpeg کار می کند، بنابراین base64 در اینجا مختص مدل است، نه یک نیاز جهانی برای هر فراخوانی رونویسی.
من از مسیر توربو در اینجا به طور خاص استفاده می کنم زیرا به من اجازه می دهد که فیلدهای دستورالعمل/زمینه را اضافه کنم (مانند initial_prompt) همراه با صدا، که به اسم های مناسب و کیفیت رونویسی کلی برای این قالب پادکست کمک می کند.
فقط از اطلاعاتی استفاده کنید که صریحاً در رونوشتهای ارائه شده و/یا یادداشتهای تماس موجود است.
جزئیات (نام، شرکت ها، حامیان مالی، محصولات، مکان ها، پیوندها) را ایجاد نکنید.
اگر در مورد جزئیات مطمئن نیستید، به جای حدس زدن، آن را کنار بگذارید.
بنابراین تا زمانی که انتشار را فشار می دهم، معمولاً یک پیش نویس کامل (صوتی، رونوشت، عنوان، توضیحات، کلمات کلیدی) دارم که می توانم به جای ایجاد دستی همه چیز را به سرعت ویرایش کنم.
ساخت اپلیکیشن های مبتنی بر هوش مصنوعی با ابزارهای مبتنی بر هوش مصنوعی فوق العاده است. من توانسته ام چیزهای زیادی خلق کنم که در غیر این صورت هیچ وقت وقت نکردم ایجاد کنم، و امیدوارم این ویژگی های جدید در پادکست کال کنت، سؤال کردن از من و باز کردن موضوعات برای بحث را برای شما آسان تر کند!
در تماس ها می بینمت!



