مقالات

من به شما کمک می کنم با هوش مصنوعی از من سؤال کنید


همانطور که در پست دیگرم اشاره کردم، برخی از ویژگی‌های بسیار جالب مبتنی بر هوش مصنوعی را به kentcdodds.com اضافه کرده‌ام و می‌خواهم همه چیز را به شما بگویم.

اگر نمی دانید، از زمانی که این سایت در سال 2021 راه اندازی شد، من پادکست Call Kent را معرفی کرده ام که در آن به سؤالات جامعه پاسخ می دهم. تا کنون بیش از 200 قسمت ضبط و ارسال شده است.

روش کار این است (همانطور که در ادامه توضیح داده شد /calls):

شما سؤال کوتاه خود (120 ثانیه یا کمتر) را مستقیماً از مرورگر خود ضبط می کنید. سپس بعداً گوش می دهم و پاسخ خود را می دهم و از طریق جادوی فناوری (ffmpeg) سؤال و پاسخ ما ادغام شده و در پادکست قرار می گیرد.

یکی دیگر از آیتم‌های فهرست آرزوهایی که برای مدتی داشتم این است که افراد بدون نیاز به ثبت‌نام از من سؤال بپرسند یا موضوعات بحث را باز کنند.

فکر می‌کنم برخی از افراد از ثبت‌نام می‌ترسند زیرا انگلیسی زبان اول آنها نیست، یا نگران کیفیت صدای خود هستند، نگران قضاوت شدن هستند، یا می‌خواهند زمان بیشتری برای فکر کردن در مورد سؤال خود و مرتب کردن افکار خود داشته باشند. همچنین، برخی افراد فقط می‌خواهند ناشناس باشند و نام یا صدایشان با این موضوع مرتبط نباشد.

بنابراین (به لطف عوامل ساخت شگفت انگیز و پلتفرم هوش مصنوعی Cloudflare)، همه این کارها و موارد دیگر را انجام داده ام!

حالا وقتی به /calls/record، همچنان می‌توانید خودتان را ضبط کنید (با انیمیشن شکل موج عالی، HT Jhey)، اما همچنین یک دکمه کوچک برای تغییر به ورودی متن برای وارد کردن سؤال خود خواهید داشت. شما می توانید یک صدای هوش مصنوعی را برای استفاده از سؤال خود انتخاب کنید، و از آن صدا برای تولید صدای سؤال یا موضوع بحث شما استفاده می شود!

عالیه امتحانش کن!!

اوه، و هنگامی که رای خود را انتخاب کردید (یا ثبت نام کردید)، همچنین می توانید انتخاب کنید که آیا می خواهید ناشناس باشید یا نه. اگر می‌خواهید ناشناس باشید، می‌توانید به سادگی روی کادر انتخاب «ناشناس» کلیک کنید و جلد قسمت از یک آواتار عمومی Kody به جای عکس شما استفاده می‌کند.

اما این همه ماجرا نیست! من به نوبه خود می توانم به صدای شما گوش دهم، پاسخ خود را ضبط کنم و سپس رونوشت و ابرداده مکالمه ما به طور خودکار برای من تولید می شود (اگر بخواهم می توانم آن را ویرایش کنم). این باعث می شود قسمت حاصل برای همه مفیدتر باشد و در وقت من صرفه جویی زیادی کند.

در اینجا معماری جریان تماس گیرنده تبدیل متن به گفتار است /calls/record:

Prisma DBذخیره سازی صوتی R2/منابع/تماسها/ذخیرهکارگران هوش مصنوعی Cloudflare/منابع/تماسها/تکست به گفتار/ calls/record UIکاربرPrisma DBذخیره سازی صوتی R2/منابع/تماسها/ذخیرهکارگران هوش مصنوعی Cloudflare/منابع/تماسها/تکست به گفتار/ calls/record UIکاربریک سوال را وارد کنید + یک رای را انتخاب کنید + روی ذخیره کلیک کنید1PUBLISH JSON {text, voice}2نیاز به احراز هویت + تأیید متن/صدا3محدودیت سرعت برای هر کاربر (20/10 دقیقه)4گفتار را ترکیب کنید5بایت های صوتی/MPEG6نقطه صوتی7حفاظت از مدت زمان (8فرم را با صدای base64 + فراداده + پرچم ناشناس ارسال کنید9ذخیره صدای تماس گیرنده10ایجاد یک خط برای تماس (isAnonymous، audioKey و غیره)11تغییر مسیر به /calls/record/:callId12

این مسیر قبل از فراخوانی 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`,
})

پس از نوشتن پاسخ در رابط کاربری مدیریت، سرور یک خط لوله پردازش پیش‌نویس پس‌زمینه را شروع می‌کند:

Prisma DBکارگران هوش مصنوعیffmpegذخیره سازی R2پردازنده پیش نویس/منابع/تماسها/ذخیرهرابط کاربری ادمینPrisma DBکارگران هوش مصنوعیffmpegذخیره سازی R2پردازنده پیش نویس/منابع/تماسها/ذخیرهرابط کاربری ادمینcreate-episode-draft (callId + answersound)1ایجاد/جایگزینی ردیف پیش نویس (PROCESS)2startCallKentEpisodeDraftProcessing(draftId، answerBase64)3صدای تماس گیرنده را بارگیری کنید4کوک تماس گیرنده + پاسخ کنت در قسمت mp35صدای قسمت را ذخیره کنید6بخش تماس گیرنده و کنت را رونویسی کنید7رونوشت های خام8رونوشت را برای خوانایی فرمت کنید9رونوشت فرمت شده10عنوان/توضیح/کلمات کلیدی ایجاد کنید11فراداده JSON12رونوشت + فراداده را ذخیره کنید، تمام را علامت بزنید13

مسیر کد داخل است 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) همراه با صدا، که به اسم های مناسب و کیفیت رونویسی کلی برای این قالب پادکست کمک می کند.

فقط از اطلاعاتی استفاده کنید که صریحاً در رونوشت‌های ارائه شده و/یا یادداشت‌های تماس موجود است.
جزئیات (نام، شرکت ها، حامیان مالی، محصولات، مکان ها، پیوندها) را ایجاد نکنید.
اگر در مورد جزئیات مطمئن نیستید، به جای حدس زدن، آن را کنار بگذارید.

بنابراین تا زمانی که انتشار را فشار می دهم، معمولاً یک پیش نویس کامل (صوتی، رونوشت، عنوان، توضیحات، کلمات کلیدی) دارم که می توانم به جای ایجاد دستی همه چیز را به سرعت ویرایش کنم.

ساخت اپلیکیشن های مبتنی بر هوش مصنوعی با ابزارهای مبتنی بر هوش مصنوعی فوق العاده است. من توانسته ام چیزهای زیادی خلق کنم که در غیر این صورت هیچ وقت وقت نکردم ایجاد کنم، و امیدوارم این ویژگی های جدید در پادکست کال کنت، سؤال کردن از من و باز کردن موضوعات برای بحث را برای شما آسان تر کند!

در تماس ها می بینمت!


Source link

نوشته های مشابه

دیدگاهتان را بنویسید

همچنین ببینید
بستن
دکمه بازگشت به بالا