একটি FIFO বাফার অনেক ব্যবহারের ক্ষেত্রে একটি সাধারণভাবে প্রয়োজনীয় ডেটা কাঠামো। আইটেমগুলিকে বাফারের মধ্যে রাখা হয় এবং সেগুলি যে ক্রমে রাখা হয়েছিল সেই ক্রমে পুনরুদ্ধার করা হয়৷ এটি একটি সারির মতো কার্যকারিতা। একটি সারি এবং একটি বাফারের মধ্যে পার্থক্য হল যে বাফারে যে ডেটা ঢোকানো হয় সেগুলি একই ডেটা টাইপের। আরও একটি নির্বিচারে পরিমাণ ডেটা সন্নিবেশ করা যেতে পারে এবং পুনরুদ্ধারের পরিমাণও নির্বিচারে।
ব্যবহারের ক্ষেত্রে কী কী, যেখানে আপনি একই ধরণের নির্বিচারে সংখ্যা আইটেম রাখতে এবং পুনরুদ্ধার করতে চান? ডেটা প্রসেসিং ব্যতীত অন্য ক্ষেত্রগুলিতে ডাইভার্সিং: ব্যাঙ্ক অ্যাকাউন্টগুলি চিন্তা করুন: অর্থ বিভিন্ন পরিমাণে রাখা হয় এবং প্রয়োজন অনুসারে পরিমাণে নেওয়া হয়..একটি খামারে শস্য সঞ্চয়ের ক্ষেত্রেও প্রযোজ্য..কিন্তু ব্যাঙ্ক এবং শস্যভাণ্ডারগুলি এটি করে। IT-তে আমাদের জন্য যা অবশিষ্ট থাকে তা হল অডিও ডেটা, যা খুব দ্রুত আসে, কিন্তু একটি ধীর নির্দিষ্ট গতিতে চলে যেতে হয় যাতে এটি শোনা যায়। এর জন্য আজকের অপরাধী হল টেক্সট টু স্পিচ ইঞ্জিন যা ইন্টারেক্টিভ মেশিন/মানুষ যোগাযোগের সুবিধা দেয়। মেশিনটি পাঠ্য পায় (সম্ভবত একটি AI ইঞ্জিন থেকে) যা এটি অডিও বাইটে রূপান্তরিত করে মানুষের কাছে একটি নির্দিষ্ট গতিতে পাঠানো হয় যা মানুষ শুনতে পারে। প্রত্যাশিত হিসাবে মেশিনটি একটি দ্রুত ক্লিপে অডিও বাইট তৈরি করে যা মানুষের কাছে অনেক ধীর গতিতে ডেলিভারি রাখতে সক্ষম হওয়ার জন্য বাফার করতে হবে। একটি উপমা আপনার স্থানীয় গ্যাস স্টেশন. টেক্সট টু স্পিচ হল পেট্রোল ট্যাঙ্কার যা দ্রুত গতিতে প্রচুর পেট্রোল পাম্প করে, গ্যাস স্টেশনের অন্ত্রে গ্যাস ট্যাঙ্কগুলি পূরণ করে। এগুলি তারপর গ্রাহকের গাড়ি বা অন্যান্য যানবাহনে অনেক ধীর গতিতে বিতরণ করা হয়।
সংক্ষেপে, পাঠ্য থেকে বক্তৃতা (অডিও) রূপান্তর আরও দ্রুত হতে পারে। একটি অডিও বাফারের প্রয়োজন রয়েছে যা বাফারটি পূরণ করতে পাঠ্য থেকে বক্তৃতা (tts) অডিও গ্রহণ করে। এই বাফার তারপর মানুষের বক্তৃতা হারে নিষ্কাশন করা হয় এবং মানুষের বোধগম্য হয়.
অডিও ডেটা: ডেটা নিয়মিত বিরতিতে একটি অডিও সিগন্যালের মান উপস্থাপন করে (যাকে স্যাম্পলিং রেট বলা হয়) সংখ্যার একটি ক্রম নিয়ে গঠিত। চ্যানেলের ধারণাও রয়েছে, যা একাধিক অডিও সংকেত, যার ফলে একাধিক মানের একটি ক্রম হয়।
এই নিবন্ধটির উদ্দেশ্যে আমরা ইনপুট পাশে শুধুমাত্র একটি চ্যানেল এবং আউটপুট পাশে একটি চ্যানেল বিবেচনা করব।
প্রয়োজনীয়তাগুলি হল: অডিও ডেটা ফ্রেমের নির্বিচারে সংখ্যায় ইনপুট করতে সক্ষম হওয়া (একটি ফ্রেম হল একটি অডিও ডেটা পয়েন্টের প্রতিনিধিত্বকারী সংখ্যা), যা অডিও সংকেত মানগুলির একটি অর্ডারকৃত অ্যারে। আউটপুট দিকে এই ফ্রেমের একটি নির্বিচারে পরিমাণ পুনরুদ্ধার করতে সক্ষম হবেন। সীমাবদ্ধতাগুলি পরিচালনা করার জন্য আমাদের অবশ্যই সুবিধাজনক বৈশিষ্ট্যগুলি যোগ করতে হবে, যা একটি সীমিত বাফার আকার (ইনপুটে বাফারের সম্পূর্ণ শর্তের কারণ হয়), কোনও অডিও ডেটা উপলব্ধ নেই (আউটপুট দিকে বাফার খালি)। অন্যান্য সুবিধার বৈশিষ্ট্যগুলির মধ্যে অডিও ডেটার শূন্য-ভর্তি অন্তর্ভুক্ত থাকবে, যদি বাফার পুনরুদ্ধারের তুলনায় আরও অডিও ডেটা অনুরোধ করা হয়।
নিম্নলিখিতগুলি পাইথনে এই জাতীয় বাফারের বাস্তবায়ন বর্ণনা করে:
ইনকামিং অডিও বাইট বাফারে সংরক্ষণ করা হয়। বাফারের একটি 'নিচে' পয়েন্টার রয়েছে, যা বাফারটি কতটা ভরাট তা নির্দেশ করে। এটিতে একটি 'স্টার্ট পয়েন্টার' রয়েছে যা বাফারের শুরু যেখানে নতুন ডেটা পুশ করা যেতে পারে। স্টার্ট পয়েন্টারটি বাফারের শুরুতে স্থির করা হয়েছে। নিচের পয়েন্টারটি 'ডাইনামিক' এবং 'উপর এবং নিচে' যায়: যখন ডেটা বের করা হয় এবং ডেটা সন্নিবেশ করা হয় তখন 'ডাউন' হয়। ডেটা সর্বদা বাফারের শীর্ষে (স্টার্ট পয়েন্টার) ঢোকানো হয় যার ফলে বাফারে বিদ্যমান ডেটা 'নিচে' পুশ করা হয় এইভাবে নীচের পয়েন্টারের মান বৃদ্ধি পায়।
বাফার খালি অবস্থা তখন ঘটে যখন নীচের পয়েন্টারটি স্টার্ট পয়েন্টারের সমান হয়। বাফার পূর্ণ অবস্থা ঘটে যখন নীচের পয়েন্টারটি বাফারের দৈর্ঘ্যের সমান হয়।
যেখানে বাফার পূর্ণ থাকে সেগুলি পরিচালনা করার জন্য আমরা 'মহান ব্যর্থতা' অন্তর্ভুক্ত করতে পারি।
যখন বাফার পূর্ণ হয় এবং ডেটা ঢোকানোর প্রয়োজন হয়, তখন একটি ব্যতিক্রম উত্থাপন করুন। যখন বাফারটি খালি থাকে (যে ক্ষেত্রে বাফারে উপলভ্যের চেয়ে বেশি ডেটার অনুরোধ করা হয় সেগুলি সহ) অনুপস্থিত ডেটার জন্য 'শূন্য' ফেরত দিন। এটি 'নিরবতা' এর অডিও সমতুল্য যখন কোন শব্দ বলা হয় না।
এই বাফারের একটি চিত্র হল:
কোডিং: (অস্বীকৃতি: নীচের কোড তৈরি করতে কোনও AI ব্যবহার করা হয়নি। সমস্ত দোষ (প্রশংসা ভাল) লেখককে বরাদ্দ করতে হবে..)
অবজেক্ট ওরিয়েন্টেড নীতি অনুসরণ করে, কোডটি ক্লাস/অবজেক্ট হিসাবে লেখা হয় এবং এটি ব্যবহার করা সহজ। সম্পূর্ণ কোড হল:
import numpy as np #numpy is the standard package or numerical array processing class AudioBuf: def __init__(self,bufSize:int,name:str='',dtype=np.int16): self.buffer = np.zeros((bufSize), dtype=dtype) self.bufSize=bufSize self.dtype=dtype self.idx=0 self.name=name #give a name to the buffer. def putInBuf(self,inData:np.ndarray[np.dtype[np.int16]]): inData=inData[:, 0] #Get the 1st col = channel 0 - mono remainder = self.bufSize - self.idx #space available for insertion if remainder < len(inData): msg=f'Error: Buffer {self.name} is full' print(msg) self.showBuf() raise ValueError(msg) self.buffer[self.idx:self.idx + len(inData)] = inData self.idx += len(inData) def getFromBuf(self,outDataLen:int = None)->np.ndarray: if not outDataLen: outDataLen=self.idx # return entire data of length is not specified if self.idx >= outDataLen: retVal = self.buffer[:outDataLen] self.buffer[0:self.idx-outDataLen]=self.buffer[outDataLen:self.idx] #move buffer up self.idx -= outDataLen else: retVal=np.zeros((outDataLen), dtype=self.dtype) retVal[0:self.idx] = self.buffer[0:self.idx] self.idx=0 return np.reshape(retVal,(-1,1)) #The -1 value automatically calculates to the number of elements def showBuf(self): print(f'AudioBuf : {self.name} has length= {self.idx} with capacity {self.bufSize}')
অসংখ্য অডিও প্রসেসিং অ্যাপ্লিকেশনের কারণে অডিও বাফারিং এখন অপরিহার্য এবং আরও গুরুত্বপূর্ণ। উপরে উপস্থাপিত অডিও বাফার অ্যালগরিদম একটি সুবিধাজনক পাইথন ক্লাস।