FIFO बफर कई उपयोग-मामलों के लिए एक आम तौर पर आवश्यक डेटा संरचना है। आइटम को बफर में डाला जाता है और उन्हें उसी क्रम में पुनर्प्राप्त किया जाता है जिस क्रम में उन्हें डाला गया था। यह कतार के समान कार्यक्षमता है। कतार और बफर के बीच अंतर यह है कि बफर में डाला गया डेटा सभी एक ही डेटा प्रकार का होता है। इसके अलावा डेटा की एक मनमानी मात्रा डाली जा सकती है और पुनर्प्राप्ति राशि भी मनमानी होती है।
उपयोग के मामले क्या हैं, जहां आप एक ही प्रकार की मनमानी संख्या वाली वस्तुओं को डालना और प्राप्त करना चाहते हैं? डेटा प्रोसेसिंग के अलावा अन्य क्षेत्रों में विचलन: बैंक खातों के बारे में सोचें: पैसा अलग-अलग मात्रा में डाला जाता है और आवश्यकतानुसार मात्रा में निकाला जाता है..यही बात खेत में अनाज के भंडारण पर भी लागू होती है..लेकिन बैंक और अन्न भंडार ये काम करते हैं। आईटी में हमारे लिए जो बचा है वह ऑडियो डेटा है, जो बहुत तेजी से आता है, लेकिन इसे धीमी विशिष्ट गति से निकलना पड़ता है ताकि इसे सुना जा सके। इसके लिए आज के दोषी टेक्स्ट टू स्पीच इंजन हैं जो इंटरैक्टिव मशीन/मानव संचार की सुविधा प्रदान करते हैं। मशीन को टेक्स्ट मिलता है (संभवतः एक AI इंजन से) जिसे वह ऑडियो बाइट्स में परिवर्तित करके मानव को एक विशिष्ट गति से भेजती है जिसे मानव सुन सकता है। जैसी कि उम्मीद थी मशीन टेक्स्ट टू स्पीच एक गैसोलीन टैंकर है जो बहुत तेज़ गति से बहुत सारा गैसोलीन पंप करता है, जिससे गैस स्टेशन के अंदरूनी हिस्से में गैस टैंक भर जाते हैं। फिर इन्हें बहुत धीमी गति से ग्राहक की कारों या अन्य वाहनों में पहुँचाया जाता है।
संक्षेप में, टेक्स्ट से स्पीच (ऑडियो) में रूपांतरण बहुत तेज़ी से हो सकता है। ऑडियो बफर की ज़रूरत होती है जो बफर को भरने के लिए टेक्स्ट से स्पीच (टीटीएस) में ऑडियो प्राप्त करता है। यह बफर फिर मानव भाषण की दर से खाली हो जाता है और मनुष्य के लिए समझने योग्य होता है।
ऑडियो डेटा: डेटा में नियमित अंतराल पर ऑडियो सिग्नल के मानों को दर्शाने वाले संख्याओं का एक क्रम होता है (जिसे सैंपलिंग दर कहा जाता है)। चैनल की अवधारणा भी है, जो कई ऑडियो सिग्नल हैं, जिसके परिणामस्वरूप कई मानों का एक क्रम बनता है।
इस लेख के प्रयोजन के लिए हम इनपुट पक्ष पर केवल एक चैनल, तथा आउटपुट पक्ष पर केवल एक चैनल पर विचार करेंगे।
आवश्यकताएँ हैं: ऑडियो डेटा फ़्रेम की मनमानी संख्या में इनपुट करने में सक्षम होना (एक फ़्रेम एक ऑडियो डेटा बिंदु का प्रतिनिधित्व करने वाली संख्या है), जो ऑडियो सिग्नल मानों की एक क्रमबद्ध सरणी है। आउटपुट साइड पर इन फ़्रेम की मनमानी मात्रा को पुनः प्राप्त करने में सक्षम होना। हमें निश्चित रूप से सीमाओं को संभालने के लिए सुविधाजनक सुविधाएँ जोड़नी होंगी, जो एक सीमित बफ़र आकार (इनपुट पर बफ़र पूर्ण स्थिति का कारण बनता है), कोई ऑडियो डेटा उपलब्ध नहीं है (आउटपुट साइड पर बफ़र खाली है)। अन्य सुविधा सुविधाओं में बफ़र पुनर्प्राप्ति में उपलब्ध ऑडियो डेटा की तुलना में अधिक ऑडियो डेटा का अनुरोध किए जाने की स्थिति में ऑडियो डेटा का शून्य-भरण शामिल होगा।
निम्नलिखित पायथन में ऐसे बफर के कार्यान्वयन का वर्णन करता है:
आने वाले ऑडियो बाइट्स को बफर में संग्रहीत किया जाता है। बफर में एक 'नीचे' पॉइंटर होता है, जो बफर के भरे जाने की सीमा को इंगित करता है। इसमें एक 'प्रारंभ पॉइंटर' भी होता है जो बफर की शुरुआत है जहाँ नया डेटा पुश किया जा सकता है। आरंभ पॉइंटर बफर की शुरुआत में तय होता है। निचला पॉइंटर 'गतिशील' होता है और 'ऊपर और नीचे' जाता है: जब डेटा निकाला जाता है तो ऊपर और जब डेटा डाला जाता है तो 'नीचे'। डेटा हमेशा बफर के शीर्ष (प्रारंभ पॉइंटर) पर डाला जाता है जिसके परिणामस्वरूप बफर में मौजूदा डेटा को 'नीचे' धकेल दिया जाता है जिससे निचले पॉइंटर का मान बढ़ जाता है।
बफर खाली स्थिति तब होती है जब निचला पॉइंटर शुरुआती पॉइंटर के बराबर होता है। बफर पूर्ण स्थिति तब होती है जब निचला पॉइंटर बफर की लंबाई के बराबर होता है।
हम उन स्थितियों को संभालने के लिए 'ग्रेसफुल फेल्स' को भी शामिल कर सकते हैं जहां बफर भरा हुआ है।
जब बफर भर जाता है और डेटा डालने की आवश्यकता होती है, तो अपवाद उठाएँ। जब बफर खाली हो (जिसमें वह स्थिति भी शामिल है जहाँ बफर में उपलब्ध डेटा से अधिक डेटा का अनुरोध किया जाता है) तो गुम डेटा के लिए 'शून्य' लौटाएँ। यह ऑडियो में 'मौन' के बराबर है जब कोई शब्द नहीं बोला जाता है।
इस बफर का आरेख इस प्रकार है:
कोडिंग: (अस्वीकरण: नीचे दिए गए कोड को बनाने के लिए किसी 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}')
ऑडियो बफ़रिंग अब बहुत ज़रूरी और ज़्यादा महत्वपूर्ण हो गई है क्योंकि इसमें कई ऑडियो प्रोसेसिंग एप्लीकेशन हैं। ऊपर प्रस्तुत ऑडियो बफ़र एल्गोरिदम एक सुविधाजनक पायथन क्लास है।