Chatbot با هسته معنایی-قسمت 5: متن به گفتار

در فصل آخر ، ما با اجازه دادن به کاربر برای تعامل با مدل با استفاده از صدای خود ، اولین قابلیت صوتی را به چت بابات خود اضافه کردیم. در این فصل ، ما می خواهیم مهارت متضاد را اضافه کنیم: صدایی به chatbot ما.
متن به گفتار
در زمان های اخیر ، مدل ها در ایجاد صدا بر اساس ورودی متن بسیار بهبود یافته اند. در بعضی موارد ، ارائه دهندگان مدل مدل های مستقل را برای متن به گفتار ، مانند TTS از OpenAi ارائه می دهند. از طرف دیگر ، ما همچنین امکان استفاده از مدل های قدرتمندتری را داریم که از ورودی مولتییمودال (متن ، تصویر ، فیلم و صوتی) و خروجی (متن ، تصویر و صدا) پشتیبانی می کنند. برخی از نمونه های این مدل های قدرتمند تر ، Gemini 2.0 Flash از Google و GPT-4O-Realtime از OpenAI است.
امکان تولید صوتی با کیفیت بالا به لطف این مدل های TTS ، همراه با پتانسیل مدل های متن قدرتمند (مانند GPT-4O) ، بسیاری از موارد استفاده را که فقط چند سال پیش غیرقابل تصور بودند ، امکان پذیر کرده است. به عنوان مثال ، در سال 2024 ، Google Notebooklm را منتشر کرد ، برنامه ای که پادکست ها را بر اساس منابع بارگذاری شده توسط کاربر تولید می کند. اگر در حال تحقیق در مورد تکنیک های ارزیابی برای LLM ها هستید ، می توانید مطالبی مانند مقالات یا مقاله ها را بارگذاری کنید و برنامه پادکست ایجاد می کند که در آن دو صدای هوش مصنوعی مکالمه خلاصه و توضیح مطالب شما را دارند.
متن به گفتار در هسته معنایی
در نوامبر 2024 ، مایکروسافت پشتیبانی قابلیت های صوتی را به هسته معنایی اضافه کرد. برای سناریوی متن به گفتار ، گردش کار زیر را خواهیم ساخت:
- یک متن یا ورودی صوتی را معرفی کنید. می توانید مقاله قبلی را که در آن عملکرد صوتی به متن اضافه کرده ایم ، بررسی کنید.
- برای ایجاد پاسخ از ورودی کاربر از LLM استاندارد استفاده کنید.
- از TTS مدل از OpenAI برای تبدیل پاسخ به صوتی (Wavformat).
- صدای تولید شده را به کاربر بازتولید کنید.
بر اساس Chatbot قبلی ما ، دو مرحله اول در حال حاضر انجام شده است. اکنون بیایید با مدل TTS روی تبدیل پاسخ متن به یک صدا تمرکز کنیم.
تولید صوتی
اول از همه ، ما باید یک سرویس جدید را به هسته خود تزریق کنیم. در این حالت ، ما ثبت نام می کنیم AzureTextToAudio
سرویس:
# Inject the service into the Kernel
self.kernel.add_service(AzureTextToAudio(
service_id='text_to_audio_service'
))
# Get the service from the Kernel
self.text_to_audio_service:AzureTextToAudio = self.kernel.get_service(type=AzureTextToAudio)
زیرا سرویس به عنوان یک اعلام می شود Azure
سرویس ، از متغیرهای محیط زیر استفاده می کند:
-
AZURE_OPENAI_TEXT_TO_AUDIO_DEPLOYMENT_NAME
: نام مدل مستقر در Azure Openai. -
AZURE_OPENAI_API_KEY
: کلید API مرتبط با نمونه Azure Openai. -
AZURE_OPENAI_ENDPOINT
: نقطه پایانی مرتبط با نمونه Azure Openai.
به همین ترتیب ، هسته معنایی دارای اتصالات بسیاری است ، مانند OpenAITextToAudio
خدمات در این حالت ، نام متغیرها این خواهد بود:
-
OPENAI_AUDIO_TO_TEXT_MODEL_ID
: Audio OpenAI به شناسه مدل متن برای استفاده. -
OPENAI_API_KEY
: کلید API مرتبط با سازمان شما. -
OPENAI_ORG_ID
: شناسه منحصر به فرد برای سازمان شما.
می توانید تمام تنظیمات مورد استفاده در هسته معنایی را در مخزن رسمی GitHub بررسی کنید.
در TextToAudio
سرویس برای استفاده بسیار ساده است. این دو روش مهم دارد:
-
get_audio_contents
: لیستی از مطالب صوتی تولید شده را برگردانید. برخی از مدل ها از تولید چندین صوتی از یک ورودی واحد پشتیبانی نمی کنند ، در این حالت لیست فقط یک عنصر را شامل می شود. -
get_audio_content
: یکسان با روش قبلی اما همیشه اولین عنصر لیست را برگردانید.
هر دو روش یک آرگومان اختیاری دارند OpenAITextToAudioExecutionSettings
، برای سفارشی کردن رفتار خدمات. با نسخه فعلی هسته معنایی ، می توانید سرعت پخش ، صدای مورد استفاده را سفارشی کنید الیاژ پیش فرض بودن) و قالب خروجی. در این حالت ، من تصمیم گرفتم از پژواک صدا در موج دار قالب:
async def generate_audio(self, message: str) -> bytes:
audio_settings = OpenAITextToAudioExecutionSettings(voice='echo', response_format="wav")
audio_content = await self.text_to_audio_service.get_audio_content(message, audio_settings)
return audio_content.data
خروجی تولید شده توسط این روش لیستی از بایت های حاوی صدا است. اکنون می توانیم به راحتی از خروجی پاسخ استاندارد از LLM استفاده کنیم تا صدای مربوطه را تولید کنیم:
response = await assistant.generate_response(text)
add_message_chat('assistant', response)
if config['audio'] == 'enabled':
audio = await assistant.generate_audio(response)
بازتولید صوتی
پس از تولید صوتی ، برای تولید مثل آن در رایانه کاربر به برخی از کد ها نیاز داریم. برای این منظور ، من یک ساده ایجاد کرده ام AudioPlayer
کلاس با استفاده از pyaudio
کتابخانه:
import io
import wave
import pyaudio
class AudioPlayer:
def play_wav_from_bytes(self, wav_bytes, chunk_size=1024):
p = pyaudio.PyAudio()
try:
wav_io = io.BytesIO(wav_bytes)
with wave.open(wav_io, 'rb') as wf:
channels = wf.getnchannels()
rate = wf.getframerate()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=channels,
rate=rate,
output=True)
data = wf.readframes(chunk_size)
while len(data) > 0:
stream.write(data)
data = wf.readframes(chunk_size)
stream.stop_stream()
stream.close()
finally:
p.terminate()
سرانجام ، ما تماس می گیریم play_wav_from_bytes
روش برای بازتولید صوتی تولید شده توسط مدل:
# Generate response with standard LLM
response = await assistant.generate_response(text)
# Add response to the user interface
add_message_chat('assistant', response)
if config['audio'] == 'enabled':
# Generate audio from the text
audio = await assistant.generate_audio(response)
# Reproduce audio
player = AudioPlayer()
player.play_wav_from_bytes(audio)
خلاصه
در این فصل ، ما به لطف یک صدا به چت بابات خود داده ایم متن به گفتار مدل. ما با پشتیبانی از متن و صدا به عنوان ورودی و خروجی ، عامل خود را به یک عامل چندمودال تبدیل کرده ایم.
در فصل بعد ، ما chatbot را با هم ادغام خواهیم کرد Ollama
برای فعال کردن استفاده از مدل های محلی اجرا شده
به یاد داشته باشید که تمام کد در حال حاضر در مخزن GitHub من 🐍 Pychatbot برای هسته معنایی موجود است.