paint-brush
কীভাবে আপনার নিজের ভয়েস সহকারী তৈরি করবেন এবং হুইস্পার + ওল্লামা + বার্ক ব্যবহার করে স্থানীয়ভাবে এটি চালাবেন দ্বারা@vndee
1,615 পড়া
1,615 পড়া

কীভাবে আপনার নিজের ভয়েস সহকারী তৈরি করবেন এবং হুইস্পার + ওল্লামা + বার্ক ব্যবহার করে স্থানীয়ভাবে এটি চালাবেন

দ্বারা Duy Huynh13m2024/04/02
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

ভয়েস-ভিত্তিক মিথস্ক্রিয়া: ব্যবহারকারীরা তাদের ভয়েস ইনপুট রেকর্ড করা শুরু এবং বন্ধ করতে পারে এবং সহকারী জেনারেট করা অডিওটি প্লে করে প্রতিক্রিয়া জানায়। কথোপকথনমূলক প্রসঙ্গ: সহকারী কথোপকথনের প্রেক্ষাপট বজায় রাখে, আরও সুসঙ্গত এবং প্রাসঙ্গিক প্রতিক্রিয়া সক্ষম করে। Llama-2 ভাষার মডেল ব্যবহার সহকারীকে সংক্ষিপ্ত এবং ফোকাসড প্রতিক্রিয়া প্রদান করতে দেয়।
featured image - কীভাবে আপনার নিজের ভয়েস সহকারী তৈরি করবেন এবং হুইস্পার + ওল্লামা + বার্ক ব্যবহার করে স্থানীয়ভাবে এটি চালাবেন
Duy Huynh HackerNoon profile picture
কীভাবে আপনার নিজস্ব RAG তৈরি করতে হয় এবং স্থানীয়ভাবে এটি চালাতে হয় সে সম্পর্কে আমার সর্বশেষ পোস্টের পরে, আজ, আমরা এটিকে আরও এক ধাপ এগিয়ে নিয়ে যাচ্ছি শুধুমাত্র বৃহৎ ভাষার মডেলের কথোপকথন ক্ষমতা প্রয়োগ করে নয় বরং শোনা এবং বলার ক্ষমতাও যোগ করে। ধারণাটি সোজা: আমরা আইকনিক আয়রন ম্যান মুভি থেকে জার্ভিস বা ফ্রাইডে-এর কথা মনে করিয়ে দেয় এমন একটি ভয়েস সহকারী তৈরি করতে যাচ্ছি, যা আপনার কম্পিউটারে অফলাইনে কাজ করতে পারে।


যেহেতু এটি একটি পরিচায়ক টিউটোরিয়াল, তাই আমি এটি পাইথনে প্রয়োগ করব এবং নতুনদের জন্য এটি যথেষ্ট সহজ রাখব। সবশেষে, আমি কীভাবে অ্যাপ্লিকেশনটি স্কেল করতে হয় সে সম্পর্কে কিছু নির্দেশিকা প্রদান করব।

টেকস্ট্যাক

প্রথমত, আপনার একটি ভার্চুয়াল পাইথন পরিবেশ সেট আপ করা উচিত। আপনার কাছে এটির জন্য বেশ কয়েকটি বিকল্প রয়েছে, যার মধ্যে পাইয়েনভ, ভার্চুয়ালেনভ, কবিতা এবং অন্যান্য যা একই উদ্দেশ্যে কাজ করে। ব্যক্তিগতভাবে, আমি আমার ব্যক্তিগত পছন্দের কারণে এই টিউটোরিয়ালের জন্য কবিতা ব্যবহার করব। এখানে বেশ কয়েকটি গুরুত্বপূর্ণ লাইব্রেরি রয়েছে যা আপনাকে ইনস্টল করতে হবে:


  • : একটি দৃশ্যত আকর্ষণীয় কনসোল আউটপুটের জন্য।
  • : স্পিচ-টু-টেক্সট রূপান্তরের জন্য একটি শক্তিশালী টুল।
  • : টেক্সট-টু-স্পীচ সংশ্লেষণের জন্য একটি অত্যাধুনিক লাইব্রেরি, উচ্চ-মানের অডিও আউটপুট নিশ্চিত করে।
  • : বড় ভাষা মডেল (LLMs) এর সাথে ইন্টারফেস করার জন্য একটি সরল লাইব্রেরি।
  • , এবং : অডিও রেকর্ডিং এবং প্লেব্যাকের জন্য অপরিহার্য।


নির্ভরতার বিস্তারিত তালিকার জন্য, লিঙ্কটি পড়ুন।


এখানে সবচেয়ে গুরুত্বপূর্ণ উপাদান হল Large Language Model (LLM) ব্যাকএন্ড, যার জন্য আমরা ওল্লামা ব্যবহার করব। অফলাইনে LLM চালানো এবং পরিবেশন করার জন্য একটি জনপ্রিয় হাতিয়ার হিসাবে ব্যাপকভাবে স্বীকৃত। ওল্লামা আপনার কাছে নতুন হলে, আমি অফলাইন RAG-তে আমার আগের নিবন্ধটি চেক করার পরামর্শ দিচ্ছি: মূলত, আপনাকে শুধু ওল্লামা অ্যাপ্লিকেশনটি ডাউনলোড করতে হবে, আপনার পছন্দের মডেলটি টানতে হবে এবং এটি চালাতে হবে।

স্থাপত্য

ঠিক আছে, সবকিছু সেট আপ করা থাকলে, পরবর্তী ধাপে এগিয়ে যাওয়া যাক। নীচে আমাদের অ্যাপ্লিকেশনের সামগ্রিক স্থাপত্য, যা মৌলিকভাবে 3টি প্রধান উপাদান নিয়ে গঠিত:


  • স্পিচ রিকগনিশন : ব্যবহার করে, আমরা কথ্য ভাষাকে পাঠ্যে রূপান্তর করি। বিভিন্ন ডেটাসেটের উপর হুইস্পারের প্রশিক্ষণ বিভিন্ন ভাষা এবং উপভাষায় এর দক্ষতা নিশ্চিত করে।


  • কথোপকথনমূলক চেইন : কথোপকথনের ক্ষমতার জন্য, আমরা মডেলের জন্য ল্যাংচেইন ইন্টারফেস ব্যবহার করব, যা ওল্লামা ব্যবহার করে পরিবেশন করা হয়। এই সেটআপটি একটি নিরবচ্ছিন্ন এবং আকর্ষক কথোপকথন প্রবাহের প্রতিশ্রুতি দেয়।


  • স্পিচ সিনথেসাইজার : মাধ্যমে টেক্সট থেকে বক্তৃতার রূপান্তর সাধিত হয়, সুনো এআই-এর একটি অত্যাধুনিক মডেল, যা প্রাণবন্ত বক্তৃতা উৎপাদনের জন্য বিখ্যাত।


কর্মপ্রবাহটি সহজবোধ্য: বক্তৃতা রেকর্ড করুন, টেক্সটে প্রতিলিপি করুন, একটি LLM ব্যবহার করে একটি প্রতিক্রিয়া তৈরি করুন এবং বার্ক ব্যবহার করে প্রতিক্রিয়া কণ্ঠস্বর করুন৷

হুইস্পার, ওল্লামা এবং বার্কের সাথে ভয়েস সহকারীর জন্য সিকোয়েন্স ডায়াগ্রাম।

বাস্তবায়ন

বাস্তবায়নটি বার্কের উপর ভিত্তি করে একটি TextToSpeechService তৈরির মাধ্যমে শুরু হয়, পাঠ্য থেকে বক্তৃতা সংশ্লেষণ করার পদ্ধতিগুলি অন্তর্ভুক্ত করে এবং দীর্ঘ টেক্সট ইনপুটগুলিকে নির্বিঘ্নে পরিচালনা করে:

 import nltk import torch import warnings import numpy as np from transformers import AutoProcessor, BarkModel warnings.filterwarnings( "ignore", message="torch.nn.utils.weight_norm is deprecated in favor of torch.nn.utils.parametrizations.weight_norm.", ) class TextToSpeechService: def __init__(self, device: str = "cuda" if torch.cuda.is_available() else "cpu"): """ Initializes the TextToSpeechService class. Args: device (str, optional): The device to be used for the model, either "cuda" if a GPU is available or "cpu". Defaults to "cuda" if available, otherwise "cpu". """ self.device = device self.processor = AutoProcessor.from_pretrained("suno/bark-small") self.model = BarkModel.from_pretrained("suno/bark-small") self.model.to(self.device) def synthesize(self, text: str, voice_preset: str = "v2/en_speaker_1"): """ Synthesizes audio from the given text using the specified voice preset. Args: text (str): The input text to be synthesized. voice_preset (str, optional): The voice preset to be used for the synthesis. Defaults to "v2/en_speaker_1". Returns: tuple: A tuple containing the sample rate and the generated audio array. """ inputs = self.processor(text, voice_preset=voice_preset, return_tensors="pt") inputs = {k: v.to(self.device) for k, v in inputs.items()} with torch.no_grad(): audio_array = self.model.generate(**inputs, pad_token_id=10000) audio_array = audio_array.cpu().numpy().squeeze() sample_rate = self.model.generation_config.sample_rate return sample_rate, audio_array def long_form_synthesize(self, text: str, voice_preset: str = "v2/en_speaker_1"): """ Synthesizes audio from the given long-form text using the specified voice preset. Args: text (str): The input text to be synthesized. voice_preset (str, optional): The voice preset to be used for the synthesis. Defaults to "v2/en_speaker_1". Returns: tuple: A tuple containing the sample rate and the generated audio array. """ pieces = [] sentences = nltk.sent_tokenize(text) silence = np.zeros(int(0.25 * self.model.generation_config.sample_rate)) for sent in sentences: sample_rate, audio_array = self.synthesize(sent, voice_preset) pieces += [audio_array, silence.copy()] return self.model.generation_config.sample_rate, np.concatenate(pieces)
  • ইনিশিয়ালাইজেশন ( __init__ ) : ক্লাসটি একটি ঐচ্ছিক device প্যারামিটার নেয়, যা মডেলের জন্য ব্যবহার করা ডিভাইসটি নির্দিষ্ট করে (হয় cuda যদি একটি GPU পাওয়া যায়, অথবা cpu )। এটি suno/bark-small প্রাক-প্রশিক্ষিত মডেল থেকে বার্ক মডেল এবং সংশ্লিষ্ট প্রসেসর লোড করে। আপনি মডেল লোডারের জন্য suno/bark উল্লেখ করে বড় সংস্করণটিও ব্যবহার করতে পারেন।


  • সংশ্লেষণ ( synthesize ) : এই পদ্ধতিটি একটি text ইনপুট এবং একটি voice_preset প্যারামিটার নেয়, যা সংশ্লেষণের জন্য ব্যবহৃত ভয়েসটি নির্দিষ্ট করে। আপনি অন্য voice_preset মান পরীক্ষা করতে পারেন। এটি ইনপুট টেক্সট এবং ভয়েস প্রিসেট প্রস্তুত করতে processor ব্যবহার করে এবং তারপর model.generate() পদ্ধতি ব্যবহার করে অডিও অ্যারে তৈরি করে। জেনারেট করা অডিও অ্যারে একটি NumPy অ্যারেতে রূপান্তরিত হয় এবং অডিও অ্যারের সাথে নমুনা হার ফেরত দেওয়া হয়।


  • লং-ফর্ম সিন্থেসাইজ ( long_form_synthesize ) : এই পদ্ধতিটি দীর্ঘ টেক্সট ইনপুট সংশ্লেষণের জন্য ব্যবহৃত হয়। এটি প্রথমে nltk.sent_tokenize ফাংশন ব্যবহার করে বাক্যে ইনপুট টেক্সটকে টোকেনাইজ করে। প্রতিটি বাক্যের জন্য, এটি অডিও অ্যারে তৈরি করতে synthesize পদ্ধতিকে কল করে। এটি তারপর প্রতিটি বাক্যের মধ্যে একটি ছোট নীরবতা (0.25 সেকেন্ড) যোগ করে জেনারেট করা অডিও অ্যারেগুলিকে সংযুক্ত করে।


এখন যেহেতু আমরা TextToSpeechService সেট আপ করেছি, আমাদের ওল্লামা সার্ভারটিকে বড় ভাষা মডেল (LLM) পরিবেশনের জন্য প্রস্তুত করতে হবে। এটি করার জন্য, আপনাকে এই পদক্ষেপগুলি অনুসরণ করতে হবে:


  • সর্বশেষ Llama-2 মডেলটি টানুন : ওল্লামা রিপোজিটরি থেকে সর্বশেষ Llama-2 মডেল ডাউনলোড করতে নিম্নলিখিত কমান্ডটি চালান: ollama pull llama2


  • ওল্লামা সার্ভার শুরু করুন : সার্ভারটি এখনও চালু না হলে, এটি শুরু করতে নিম্নলিখিত কমান্ডটি চালান: ollama serve


একবার আপনি এই পদক্ষেপগুলি সম্পন্ন করলে, আপনার অ্যাপ্লিকেশনটি ব্যবহারকারীর ইনপুটের প্রতিক্রিয়া তৈরি করতে ওল্লামা সার্ভার এবং লামা-2 মডেল ব্যবহার করতে সক্ষম হবে৷


এর পরে, আমরা মূল অ্যাপ্লিকেশন যুক্তিতে চলে যাব। প্রথমত, আমাদের নিম্নলিখিত উপাদানগুলি শুরু করতে হবে:
  • রিচ কনসোল : আমরা টার্মিনালের মধ্যে ব্যবহারকারীর জন্য একটি ভাল ইন্টারেক্টিভ কনসোল তৈরি করতে রিচ লাইব্রেরি ব্যবহার করব।


  • হুইস্পার স্পিচ-টু-টেক্সট : আমরা একটি হুইস্পার স্পিচ রিকগনিশন মডেল শুরু করব যা OpenAI দ্বারা তৈরি একটি অত্যাধুনিক ওপেন-সোর্স স্পিচ রিকগনিশন সিস্টেম। আমরা ব্যবহারকারীর ইনপুট প্রতিলিপি করার জন্য বেস ইংরেজি মডেল ( base.en ) ব্যবহার করব।


  • বার্ক টেক্সট-টু-স্পিচ : আমরা একটি বার্ক টেক্সট-টু-স্পীচ সিন্থেসাইজার ইনস্ট্যান্স শুরু করব, যা উপরে প্রয়োগ করা হয়েছে।


  • কথোপকথনমূলক চেইন : আমরা ল্যাংচেইন লাইব্রেরি থেকে অন্তর্নির্মিত ConversationalChain ব্যবহার করব যা কথোপকথন প্রবাহ পরিচালনা করার জন্য একটি টেমপ্লেট প্রদান করে। আমরা এটিকে ওল্লামা ব্যাকএন্ডের সাথে Llama-2 ভাষার মডেল ব্যবহার করার জন্য কনফিগার করব।
 import time import threading import numpy as np import whisper import sounddevice as sd from queue import Queue from rich.console import Console from langchain.memory import ConversationBufferMemory from langchain.chains import ConversationChain from langchain.prompts import PromptTemplate from langchain_community.llms import Ollama from tts import TextToSpeechService console = Console() stt = whisper.load_model("base.en") tts = TextToSpeechService() template = """ You are a helpful and friendly AI assistant. You are polite, respectful, and aim to provide concise responses of less than 20 words. The conversation transcript is as follows: {history} And here is the user's follow-up: {input} Your response: """ PROMPT = PromptTemplate(input_variables=["history", "input"], template=template) chain = ConversationChain( prompt=PROMPT, verbose=False, memory=ConversationBufferMemory(ai_prefix="Assistant:"), llm=Ollama(), )
এখন, প্রয়োজনীয় ফাংশন সংজ্ঞায়িত করা যাক:
  • record_audio : sounddevice.RawInputStream ব্যবহার করে ব্যবহারকারীর মাইক্রোফোন থেকে অডিও ডেটা ক্যাপচার করতে এই ফাংশনটি একটি পৃথক থ্রেডে চলে।RawInputStream। যখনই নতুন অডিও ডেটা পাওয়া যায় তখন কলব্যাক ফাংশনটিকে বলা হয় এবং এটি আরও প্রক্রিয়াকরণের জন্য ডেটাটিকে data_queue রাখে।


  • transcribe : এই ফাংশনটি data_queue থেকে অডিও ডেটাকে টেক্সটে ট্রান্সক্রাইব করতে হুইস্পার ইনস্ট্যান্স ব্যবহার করে।


  • get_llm_response : এই ফাংশনটি Llama-2 ভাষার মডেলে বর্তমান কথোপকথনের প্রসঙ্গ ফিড করে (Langchain ConversationalChain এর মাধ্যমে) এবং জেনারেট করা পাঠ্য প্রতিক্রিয়া পুনরুদ্ধার করে।


  • play_audio : এই ফাংশনটি বার্ক টেক্সট-টু-স্পিচ ইঞ্জিন দ্বারা তৈরি অডিও তরঙ্গরূপ নেয় এবং এটি একটি সাউন্ড প্লেব্যাক লাইব্রেরি (যেমন, sounddevice ) ব্যবহার করে ব্যবহারকারীর কাছে ফিরিয়ে দেয়।
 def record_audio(stop_event, data_queue): """ Captures audio data from the user's microphone and adds it to a queue for further processing. Args: stop_event (threading.Event): An event that, when set, signals the function to stop recording. data_queue (queue.Queue): A queue to which the recorded audio data will be added. Returns: None """ def callback(indata, frames, time, status): if status: console.print(status) data_queue.put(bytes(indata)) with sd.RawInputStream( samplerate=16000, dtype="int16", channels=1, callback=callback ): while not stop_event.is_set(): time.sleep(0.1) def transcribe(audio_np: np.ndarray) -> str: """ Transcribes the given audio data using the Whisper speech recognition model. Args: audio_np (numpy.ndarray): The audio data to be transcribed. Returns: str: The transcribed text. """ result = stt.transcribe(audio_np, fp16=False) # Set fp16=True if using a GPU text = result["text"].strip() return text def get_llm_response(text: str) -> str: """ Generates a response to the given text using the Llama-2 language model. Args: text (str): The input text to be processed. Returns: str: The generated response. """ response = chain.predict(input=text) if response.startswith("Assistant:"): response = response[len("Assistant:") :].strip() return response def play_audio(sample_rate, audio_array): """ Plays the given audio data using the sounddevice library. Args: sample_rate (int): The sample rate of the audio data. audio_array (numpy.ndarray): The audio data to be played. Returns: None """ sd.play(audio_array, sample_rate) sd.wait()
তারপর, আমরা প্রধান অ্যাপ্লিকেশন লুপ সংজ্ঞায়িত করি। প্রধান অ্যাপ্লিকেশন লুপ ব্যবহারকারীকে কথোপকথনমূলক মিথস্ক্রিয়া দ্বারা নির্দেশিত করে:


  1. ব্যবহারকারীকে তাদের ইনপুট রেকর্ড করা শুরু করতে এন্টার চাপতে বলা হয়।


  2. ব্যবহারকারী একবার এন্টার চাপলে, ব্যবহারকারীর অডিও ইনপুট ক্যাপচার করার জন্য record_audio ফাংশনটিকে একটি পৃথক থ্রেডে ডাকা হয়।


  3. যখন ব্যবহারকারী রেকর্ডিং বন্ধ করতে আবার এন্টার চাপেন, তখন transcribe ফাংশন ব্যবহার করে অডিও ডেটা প্রতিলিপি করা হয়।


  4. প্রতিলিপিকৃত পাঠ্যটি তারপর get_llm_response ফাংশনে প্রেরণ করা হয়, যা Llama-2 ভাষা মডেল ব্যবহার করে একটি প্রতিক্রিয়া তৈরি করে।


  5. উৎপন্ন প্রতিক্রিয়া কনসোলে প্রিন্ট করা হয় এবং play_audio ফাংশন ব্যবহার করে ব্যবহারকারীর কাছে ফিরে আসে।

 if __name__ == "__main__": console.print("[cyan]Assistant started! Press Ctrl+C to exit.") try: while True: console.input( "Press Enter to start recording, then press Enter again to stop." ) data_queue = Queue() # type: ignore[var-annotated] stop_event = threading.Event() recording_thread = threading.Thread( target=record_audio, args=(stop_event, data_queue), ) recording_thread.start() input() stop_event.set() recording_thread.join() audio_data = b"".join(list(data_queue.queue)) audio_np = ( np.frombuffer(audio_data, dtype=np.int16).astype(np.float32) / 32768.0 ) if audio_np.size > 0: with console.status("Transcribing...", spinner="earth"): text = transcribe(audio_np) console.print(f"[yellow]You: {text}") with console.status("Generating response...", spinner="earth"): response = get_llm_response(text) sample_rate, audio_array = tts.long_form_synthesize(response) console.print(f"[cyan]Assistant: {response}") play_audio(sample_rate, audio_array) else: console.print( "[red]No audio recorded. Please ensure your microphone is working." ) except KeyboardInterrupt: console.print("\n[red]Exiting...") console.print("[blue]Session ended.")

ফলাফল

একবার সবকিছু একসাথে রাখা হলে, উপরের ভিডিওতে দেখানো হিসাবে আমরা অ্যাপ্লিকেশনটি চালাতে পারি। অ্যাপ্লিকেশনটি আমার ম্যাকবুকে বেশ ধীরে ধীরে চলে কারণ বার্ক মডেলটি বড়, এমনকি তার ছোট সংস্করণেও। তাই, আমি ভিডিওটির গতি কিছুটা বাড়িয়ে দিয়েছি। যাদের CUDA-সক্ষম কম্পিউটার আছে তাদের জন্য এটি দ্রুত চলতে পারে। এখানে আমাদের অ্যাপ্লিকেশনের মূল বৈশিষ্ট্যগুলি রয়েছে:


  • ভয়েস-ভিত্তিক মিথস্ক্রিয়া : ব্যবহারকারীরা তাদের ভয়েস ইনপুট রেকর্ড করা শুরু এবং বন্ধ করতে পারে এবং সহকারী জেনারেট করা অডিওটি প্লে করে প্রতিক্রিয়া জানায়।


  • কথোপকথনমূলক প্রসঙ্গ: সহকারী কথোপকথনের প্রেক্ষাপট বজায় রাখে, আরও সুসঙ্গত এবং প্রাসঙ্গিক প্রতিক্রিয়া সক্ষম করে। Llama-2 ভাষার মডেল ব্যবহার সহকারীকে সংক্ষিপ্ত এবং ফোকাসড প্রতিক্রিয়া প্রদান করতে দেয়।


যারা এই অ্যাপ্লিকেশনটিকে উৎপাদন-প্রস্তুত অবস্থায় উন্নীত করার লক্ষ্যে, তাদের জন্য নিম্নলিখিত বর্ধনগুলি সুপারিশ করা হয়:
  • পারফরম্যান্স অপ্টিমাইজেশান : মডেলগুলির অপ্টিমাইজ করা সংস্করণগুলি অন্তর্ভুক্ত করুন, যেমন whisper.cpp, llama.cpp, এবং bark.cpp, যা কর্মক্ষমতা বৃদ্ধির জন্য ডিজাইন করা হয়েছে, বিশেষত নিম্ন প্রান্তের কম্পিউটারগুলিতে৷


  • কাস্টমাইজযোগ্য বট প্রম্পট : এমন একটি সিস্টেম প্রয়োগ করুন যা ব্যবহারকারীদের বটের ব্যক্তিত্ব এবং প্রম্পট কাস্টমাইজ করতে দেয়, বিভিন্ন ধরনের সহকারী (যেমন, ব্যক্তিগত, পেশাদার বা ডোমেন-নির্দিষ্ট) তৈরি করতে সক্ষম করে।


  • গ্রাফিকাল ইউজার ইন্টারফেস (GUI) : সার্বিক ব্যবহারকারীর অভিজ্ঞতা বাড়াতে একটি ব্যবহারকারী-বান্ধব GUI বিকাশ করুন, অ্যাপ্লিকেশনটিকে আরও অ্যাক্সেসযোগ্য এবং দৃশ্যত আকর্ষণীয় করে তুলুন।


  • মাল্টিমোডাল ক্ষমতা : মাল্টিমোডাল মিথস্ক্রিয়াকে সমর্থন করার জন্য অ্যাপ্লিকেশনটি প্রসারিত করুন, যেমন ভয়েস-ভিত্তিক প্রতিক্রিয়াগুলি ছাড়াও ছবি, ডায়াগ্রাম বা অন্যান্য ভিজ্যুয়াল সামগ্রী তৈরি এবং প্রদর্শন করার ক্ষমতা।


অবশেষে, আমরা আমাদের সাধারণ ভয়েস সহকারী অ্যাপ্লিকেশনটি সম্পন্ন করেছি, সম্পূর্ণ কোড এখানে পাওয়া যাবে: । বক্তৃতা শনাক্তকরণ, ভাষা মডেলিং এবং টেক্সট-টু-স্পিচ প্রযুক্তির এই সংমিশ্রণটি দেখায় যে আমরা এমন কিছু তৈরি করতে পারি যা শুনতে কঠিন কিন্তু আসলে আপনার কম্পিউটারে চলতে পারে। আসুন কোডিং উপভোগ করি, এবং সাবস্ক্রাইব করতে ভুলবেন না যাতে আপনি AI এবং প্রোগ্রামিং নিবন্ধগুলির সাম্প্রতিকতমগুলি মিস করবেন না৷

এছাড়াও প্রকাশিত

바카라사이트 바카라사이트 온라인바카라