arduino वर DIY आवाज नियंत्रण. FZ0475 व्हॉइस रेकग्निशन मॉड्यूलवर आधारित व्हॉइस कमांड कंट्रोल. Arduino UNO कंट्रोलर कनेक्ट करत आहे

विंडोज फोनसाठी 06.03.2019
विंडोज फोनसाठी

काही वर्षांपूर्वी (आणि कदाचित आताही) टाळ्या वाजवून खोलीतील प्रकाश नियंत्रित करण्याची कल्पना कशी लोकप्रिय होती हे तुम्हाला आठवते का? पण, हे खूप सोयीचे आहे, तुम्ही अंथरुणावर पडून आहात, उठून टाळ्या वाजवून लाईट बंद करण्यात खूप आळशी आहात, किंवा आम्ही घरी जाऊ, अंधार आहे, स्विच शोधायला बराच वेळ लागतो आणि मग अगदी उंबरठ्यापासून एक किंवा दोन टाळ्या आहेत आणि प्रकाश आधीच चालू आहे. मला असे वाटते की ही संकल्पना अजूनही संबंधित आहे, परंतु ती अधिक लागू केली जाऊ शकते उच्च तंत्रज्ञान 5 वर्षे, 10 वर्षांपूर्वीच्या तुलनेत. आता, तुलनेने कमी रकमेसाठी, आपण अनेक भाग खरेदी करू शकता आणि डिझाइन प्रोग्राम करू शकता समान कार्ये, कशाबद्दल आम्ही बोलूखाली

आज आपण व्हॉईस कमांड (रेकॉर्ड केलेल्या व्हॉईस कमांडमधील आवाजांसह) ओळखण्यासाठी डिझाइन केलेले मॉड्यूल पाहू. व्हॉइस रेकग्निशन मॉड्यूल V3.1 (V3)किंवा वारंवार आढळणारे एन्कोडिंग नाव FZ0475.

वितरण पॅकेजमध्ये स्वतः मॉड्यूल समाविष्ट आहे ( छापील सर्कीट बोर्डखूप चांगल्या दर्जाचे), 3.5 मिमी जॅक कनेक्टरसह लवचिक पायावरील मायक्रोफोन आणि मॉड्यूल बोर्डसाठी 2.56 मिमीच्या पिचसह कोनीय PLS संपर्क (वेगळ्या प्रकारे मॉड्यूल संपर्कांशी कनेक्ट केल्यास ते वापरले जाऊ शकत नाहीत).

आज, समान कार्यक्षमतेसह अनेक प्रकारचे मॉड्यूल आहेत. विविध उत्पादकआणि विकासक किंवा अंमलबजावणी. हे मॉड्यूलमाझ्या मते, व्हॉइस रेकग्निशनमध्ये किंमत, कार्यक्षमता आणि सुविधा यांच्यात एक विशिष्ट संतुलन आहे. EasyVR मॉड्यूल अधिक शक्तिशाली आणि लक्षणीयरीत्या अधिक महाग असेल. LD3320 वर आधारित मॉड्यूल स्वस्त आणि अधिक गैरसोयीचे असतील (किमान गैरसोयीचे कारण त्यांच्यासाठी सामान्य वर्णन शोधणे सोपे नाही, परंतु अन्यथा हे व्यक्तिनिष्ठ आहे).

व्हॉइस रेकग्निशन मॉड्यूल V3.1 (V3) ची वैशिष्ट्ये:

  • पुरवठा व्होल्टेज - 5 व्होल्ट
  • वर्तमान वापर - 40 एमए पर्यंत
  • इंटरफेस - UART, GPIO
  • ओळख अचूकता - 99% (आदर्श परिस्थितीत)
  • श्रेणी - वापरलेल्या मायक्रोफोनवर अवलंबून असते, किटमध्ये समाविष्ट केलेल्या मानक मायक्रोफोनसाठी पुरेशा मोठ्या आवाजासह श्रेणी 0.5 - 1 मीटर कमाल अंतर आहे, परंतु आवाज शांत असल्यास, तुम्हाला मायक्रोफोन तुमच्या तोंडाजवळ आणावा लागेल.

मॉड्यूल हा एक छोटासा व्यवस्थित बोर्ड आहे ज्यावर मुख्य मायक्रोकंट्रोलर (काळा डाग), मायक्रोफोन कनेक्ट करण्यासाठी 3.5 मिमी जॅक कनेक्टर, फ्लॅश चिपमेमरी, जीपीआयओ, यूएआरटी आणि पॉवर संपर्क, एलईडीची एक जोडी आणि सर्किटच्या ऑपरेशनसाठी आवश्यक असलेली उर्वरित आवश्यक उपकरणे - प्रतिरोधक, कॅपेसिटर, क्वार्ट्ज. बोर्डचा कॉम्पॅक्ट आकार आपल्याला मॉड्यूल सहजपणे आपल्या स्वतःच्या डिझाइनमध्ये समाकलित करण्यास अनुमती देईल. व्हॉइस कमांड्सची श्रेणी वाढवण्यासाठी, बहुधा एम्प्लीफाइड मायक्रोफोन वापरणे आवश्यक आहे. एकदा स्वीकार्य श्रेणी प्राप्त झाल्यानंतर, मॉड्यूल सिस्टममध्ये वापरण्यासाठी योग्य आहे स्मार्ट घर. ऑपरेटिंग श्रेणी सुधारण्यासाठी बदल न करता, मॉड्यूल मध्ये वापरले जाऊ शकते डेस्कटॉप प्रणालीव्यवस्थापन, तसेच सुरक्षा प्रणालींमध्ये (प्रवेश नियंत्रण आणि निर्बंध). मानक मायक्रोफोनसह, लहान श्रेणीमुळे, हेडसेट म्हणून व्हॉइस रेकग्निशन मॉड्यूल वापरणे सर्वात विश्वासार्ह आहे आणि वायरलेसपणेबॅटरी आणि वायरलेस मॉड्यूल्स (उदाहरणार्थ, HC-05 किंवा HC-12 किंवा इतर कोणतेही योग्य) वापरून नियंत्रण करणाऱ्या कंट्रोलरला कमांड पाठवा. मॉड्यूलशिवाय कार्य करू शकते बाह्य मायक्रोकंट्रोलर, निर्माता कार्यात्मक स्वातंत्र्य प्रदान करत असल्याने, तुम्हाला फक्त एकदाच व्हॉइस कमांड रेकॉर्ड करणे आणि यासाठी सेटिंग्ज सेट करणे आवश्यक आहे. स्वतंत्र काममदतीसह बाह्य साधन(पीसी किंवा एमके).

म्हणून, व्हॉइस रेकग्निशन मॉड्यूलसह ​​कार्य सुरू करण्यासाठी, आम्हाला ते एकतर संगणकाशी (तुम्हाला USB-UART अडॅप्टरची आवश्यकता आहे) किंवा मायक्रोकंट्रोलरशी कनेक्ट करणे आवश्यक आहे (तुम्हाला विकसित करणे आवश्यक आहे. प्रोग्राम कोडमॉड्यूल नियंत्रित करण्यासाठी).

कॉम्प्युटर किंवा मायक्रोकंट्रोलरशी कनेक्ट होण्यामध्ये मॉड्यूलचे व्यवस्थापन आणि कॉन्फिगर करण्यात कोणताही मूलभूत फरक नाही, म्हणून स्पष्टतेसाठी, आम्ही कॉन्फिगरेशनसाठी पीसी वापरू. सूचना हेक्साडेसिमल स्वरूपात मॉड्यूलच्या आदेशांचे वर्णन करतात, त्यामुळे सोयीसाठी तुम्हाला हेक्साडेसिमल स्वरूपात बाइट प्रसारित करणारे टर्मिनल देखील आवश्यक असेल, उदाहरणार्थ, AccessPort (लेखाच्या शेवटी डाउनलोड केले जाऊ शकते). याव्यतिरिक्त, निर्माता Arduino प्लॅटफॉर्मच्या वापरकर्त्यांवर लक्ष केंद्रित करतो आणि हे मॉड्यूल वापरण्यासाठी एक लायब्ररी आणि ही लायब्ररी वापरण्यासाठी सूचना प्रदान करतो. तथापि, आपल्यापैकी बऱ्याच जणांना Arduino रॅपरच्या ऐवजी थेट मॉड्यूलसह ​​काम करण्यात जास्त रस असतो.

काम सुरू करण्यापूर्वी, बोर्ड पाहू. उजवीकडे बोर्डच्या शेवटी मायक्रोफोन कनेक्ट करण्यासाठी एक सॉकेट आहे, तर दुसरीकडे चार संपर्क आहेत UART इंटरफेस. तळाशी आठ संपर्क आहेत जे व्हॉइस कमांडच्या ओळखीमुळे सिग्नल आउटपुट करण्यासाठी वापरले जातात. शीर्षस्थानी, सिग्नल इनपुट म्हणून कॉन्फिगर केलेल्या चार पिन कमांडच्या गटांमध्ये (प्रत्येकी सात व्हॉईस कमांडच्या) स्विच करण्यासाठी वापरल्या जातात, जर असे वैशिष्ट्य वापरले असेल. आणि शीर्षस्थानी उर्वरित सहा पिन बहुधा मॉड्यूलच्या मेमरीशी जोडण्यासाठी वापरल्या जातात.

मॉड्यूल ऑपरेट आणि कॉन्फिगर करण्यासाठी कमांड सिस्टम वापरली जाते. सामान्य फॉर्मफ्रेम असे दिसते:

पहिल्या चार कमांड्स 00, 01, 02, 03 मॉड्यूलची स्थिती आणि त्याची सेटिंग्ज तपासण्यासाठी वापरली जातात. पुढील सहा कमांड 10, 11, 12, 13, 14, 15 आउटपुट पोर्ट कंट्रोल आणि ऑटो लोड सेटिंग्जसह मॉड्यूल सेटिंग्ज बदलण्यासाठी वापरल्या जातात. पुढे, व्हॉइस कमांड रेकॉर्ड करण्यासाठी 20,21, 22 या तीन कमांड्स वापरल्या जातात. पुढील तीन कमांड्स 30,31,32 व्हॉइस कमांड्सची ओळख नियंत्रित करण्यासाठी वापरली जातात. 0A, 0D, FF आज्ञा फक्त मॉड्यूलद्वारे डेटा परत केल्यावरच वापरल्या जातात. प्रत्यक्षात अनेक आदेश नाहीत आणि हे सर्व इतके भयानक नाही जितके ते मॉड्यूलच्या दस्तऐवजीकरणात पहिल्या दृष्टीक्षेपात दिसते. व्हॉइस रेकग्निशन मॉड्युलसह काम करण्यासाठी आवश्यक असलेल्या कमांड्स पाहू. सध्याच्या सर्व आज्ञा व्यावहारिक नाहीत.

हे लक्षात घेण्यासारखे आहे की मॉड्यूल बाह्य नियंत्रण मायक्रोकंट्रोलरशिवाय कार्य करू शकते आणि त्याच्या आउटपुट पोर्टसह स्वतंत्रपणे काहीतरी नियंत्रित करू शकते. हे करण्यासाठी, आपण त्यांना कॉन्फिगर करणे आवश्यक आहे (आदेश 12, 13, 14).

संघ १२ - आउटपुट पोर्ट कॉन्फिगर करा. हा आदेश व्हॉइस रेकग्निशन मॉड्यूल आउटपुट पोर्टचा ऑपरेटिंग मोड कॉन्फिगर करतो.

स्वरूप: | एए | 03 | १२ | मोड | 0अ |

जेथे MODE चार मूल्ये घेऊ शकतात: 0 – पल्स मोड (जेव्हा व्हॉईस कमांड ट्रिगर केला जातो, तेव्हा कमांड 13 ने सेट केलेल्या वेळेसाठी कमांडशी संबंधित आउटपुट त्याची स्थिती बदलेल), 1 – स्विच मोड (टॉगल किंवा फ्लिप) (प्रत्येक वेळी व्हॉईस कमांड ट्रिगर केला जातो, व्हॉईस कमांडशी संबंधित आउटपुट उलटे होते), 2 – ऑन मोड (जेव्हा व्हॉईस कमांड ट्रिगर केला जातो, तेव्हा आउटपुट लॉजिकल एका स्थितीत जाईल आणि यापुढे लॉजिकल शून्य स्थितीत जाणार नाही, रीसेट आहे कमांड 14 द्वारे चालते), 3 – ऑफ मोड (ऑन मोड प्रमाणेच, फक्त त्याउलट, जेव्हा व्हॉइस कमांड ट्रिगर केला जातो, तेव्हा आउटपुट तार्किक शून्य स्थितीत जाते).

सर्वात व्यावहारिक म्हणजे स्विच मोड, ज्याची आवश्यकता नाही अतिरिक्त आदेश. पल्स मोड चांगला असेल, परंतु या मोडचे लॉजिक असे आहे की जेव्हा व्हॉईस कमांड ट्रिगर केला जातो तेव्हा तो एकदा लॉजिकल जारी करतो, 10 ms ते 1 s पर्यंत. ते पुरेसे नाही. जरी, या मोडच्या आवश्यकतांवर अवलंबून, ते उपयुक्त असू शकते. चालू आणि बंद मोड गैरसोयीने लागू केले जातात, कारण त्यांना अतिरिक्त आदेशांची अंमलबजावणी आवश्यक असते.

संघ 13 - संबंधित मोडचा पल्स कालावधी सेट करणे.

स्वरूप: | एए | 03 | 13 | स्तर | 0अ |

जेथे LEVEL 00 ते 0F पर्यंत मूल्य घेते (10 ms ते 1 s पर्यंतच्या कालावधीशी संबंधित).

पातळी कालावधी
0x00 10 ms
0x01 १५ मिसे
0x02 20 ms
0x03 २५ मिसे
0x04 30 ms
0x05 35 ms
0x06 40 ms
0x07 ४५ मिसे
0x08 50 ms
0x09 75 एमएस
0x0A 100 ms
0x0B 200 ms
0x0C 300 ms
0x0D 400 ms
0x0E 500 ms
0x0F 1 एस

संघ 14 - आउटपुट पोर्ट चालू किंवा बंद मोडद्वारे निर्दिष्ट केलेल्या स्थितीवर रीसेट करा.

स्वरूप: | AA| 03 | 14 | FF | 0अ | - सर्व आउटपुट पोर्ट रीसेट करा

| AA| 03+n | 14 | IO0 | ... | ION | 0अ | - निवडलेले आउटपुट पोर्ट रीसेट करा

जेथे n निवडकपणे रीसेट केलेल्या पिनची संख्या आहे, IO0...IOn ही डेटा पाठवणाऱ्या फ्रेममध्ये या पिनची सूची आहे.

पुढे, व्हॉइस कमांड कार्यान्वित करण्यासाठी, ते मॉड्यूलमध्ये रेकॉर्ड केले जाणे आवश्यक आहे (मॉड्यूल प्रशिक्षित करा). इथे मर्यादा आहे. एका वेळी फक्त सात आज्ञा ओळखल्या जाऊ शकतात, जरी बरेच रेकॉर्ड केले जाऊ शकतात. ओळखल्या जाणाऱ्या व्हॉईस कमांडच्या श्रेणीचा विस्तार करण्यासाठी, एक ग्रुपिंग सिस्टम (कमांड 32) वापरली जाते, जी मॉड्यूल इनपुट पोर्टद्वारे नियंत्रित केली जाते. या पिनवर सिग्नल कॉन्फिगरेशन सेट करून, तुम्ही ओळखल्या जाणाऱ्या कमांड्सचा गट निवडा. हे मॉड्यूलच्या व्हॉइस कंट्रोलरच्या मर्यादित कार्यक्षमतेमुळे आहे.

संघ 20 - एक किंवा अधिक व्हॉइस कमांड रेकॉर्ड करणे.

स्वरूप: | AA| 03+n | 20 | R0 | ... | Rn | 0अ |

जिथे रेकॉर्ड करायच्या व्हॉइस कमांड्सची संख्या n आहे (जर एक कमांड n=0 रेकॉर्ड केली असेल, तर दोन कमांड्स n=1 आणि याप्रमाणे. सामान्य स्वरूपकमांड्सचे प्रसारण लांबी - लांबी), R0...Rn व्हॉइस कमांड्सची संख्या (AA 03 20 03 0A - तिसरी व्हॉइस कमांड रेकॉर्ड करण्यासाठी कमांड).

संघ 21 - एक व्हॉइस कमांड रेकॉर्ड करा आणि त्यासाठी स्वाक्षरी सेट करा.

स्वरूप: | AA| 03+SIGLEN | २१ | रेकॉर्ड | SIG | 0अ |

जिथे RECORD हा व्हॉइस कमांड नंबर आहे, SIG ही स्वाक्षरी आहे (अनेक बाइट्स असू शकतात, जेणेकरुन आवश्यक असल्यास प्रत्येक बाइट वर्णमाला वर्ण एन्कोडिंगशी संबंधित असेल), SIGLEN ही स्वाक्षरी बनवणाऱ्या बाइट्सची संख्या आहे.

संघ 22 - निवडलेल्या व्हॉइस कमांडसाठी स्वाक्षरी जोडा किंवा हटवा.

स्वरूप: | एए | 03+SIGLEN | 22 | रेकॉर्ड | SIG | 0अ | - स्वाक्षरी जोडणे

| एए | 03 | 22 | रेकॉर्ड | 0अ | - स्वाक्षरी काढणे

व्हॉइस कमांड रेकॉर्ड करताना, तुम्हाला LED सिग्नलद्वारे मार्गदर्शन करणे आवश्यक आहे. रेकॉर्डिंग प्रक्रिया सुरू करणारी कमांड एंटर केल्यानंतर, पिवळा (केशरी) एलईडी पटकन लुकलुकायला लागतो. लाल LED दिवे लागताच, तुम्ही मायक्रोफोनमध्ये व्हॉईस कमांड म्हणणे आवश्यक आहे. यशस्वी झाल्यास, पिवळा (केशरी) LED उजळेल आणि नंतर पुन्हा लाल होईल - तुम्हाला व्हॉइस कमांडची पुष्टी करावी लागेल आणि ते पुन्हा सांगावे लागेल. यशस्वी झाल्यास, दोन्ही LED उजळतील - व्हॉइस कमांड सेव्ह केली गेली आहे.

एकदा मॉड्युलमध्ये व्हॉइस कमांड रेकॉर्ड केल्यावर, या कमांड्स मॉड्यूलच्या “रेकग्नायझर” मध्ये ठेवल्या जाईपर्यंत काहीही होणार नाही. हे करण्यासाठी, तुम्हाला कमांड 30 वापरण्याची आवश्यकता आहे. ही कमांड कार्यान्वित केल्यानंतर, मॉड्यूल जतन केलेल्या नमुन्यांशी जुळण्यासाठी व्हॉइस कमांडची प्रतीक्षा करण्यास सुरवात करेल. एका वेळी फक्त सात आज्ञा ओळखल्या जाऊ शकतात. या प्रकरणात, मॉड्यूल बोर्डवरील पिवळा (केशरी) एलईडी हळू हळू लुकलुकेल.

संघ 30 - मॉड्यूलच्या रेकग्नायझरमध्ये रेकॉर्ड लोड करा.

स्वरूप: | AA| 2+n | 30 | R0 | ... | Rn | 0अ |

प्रतिसादाचे स्वरूप खालीलप्रमाणे आहे: | एए | ०७ | 0D | 00 | GRPM | आर | RI | SIGLEN | SIG | 0अ |

जिथे GRPM ही कमांड कोणत्या गटाशी संबंधित आहे (वापरल्यास), R ही मान्यताप्राप्त व्हॉईस कमांड आहे (ह्या डेटाचा वापर करून तुम्ही एकमेकांपासून कमांड वेगळे करू शकता जर स्वाक्षरी वापरल्या जात नाहीत), RI ही ओळखकर्त्यामध्ये कमांड इंडेक्स आहे, SIGLEN म्हणजे बाइट्समधील स्वाक्षरीची लांबी, SIG - स्वाक्षरी (वापरल्यास).

आणि शेवटी, जर मॉड्यूलने स्वतंत्रपणे कार्य केले पाहिजे, तर तुम्हाला कमांड 15 to वापरण्याची आवश्यकता आहे स्वयंचलित प्रारंभओळखकर्त्याच्या प्रीसेटनुसार. या प्रकरणात, व्हॉइस रेकग्निशन मॉड्युल चालू केल्यानंतर प्रारंभ न करता स्वतंत्रपणे कार्य करेल.

संघ 15 - ऑन केल्यावर ओळखकर्ता ऑटोस्टार्टवर सेट करा.

स्वरूप: | AA| 03 | १५ | 00 | 0अ | - ऑटोरन फंक्शन अक्षम करा

| AA| 03+n | १५ | BITMAP | R0 | ... | Rn | 0अ | - ऑटोरन फंक्शन सेट करणे

आदेशांच्या योग्य अंमलबजावणीवर नियंत्रण ठेवण्यासाठी, त्या प्रत्येकाचा स्वतःचा प्रतिसाद असतो. आवश्यक असल्यास, लेखाच्या शेवटी जोडलेल्या व्हॉइस रेकग्निशन मॉड्यूलसाठी सर्व डेटा दस्तऐवजीकरणामध्ये आढळू शकतो. हे सर्व विसरू नका संख्यात्मक मूल्येमध्ये सादर केले हेक्साडेसिमलफॉर्म

अशा प्रकारे, कमांड सिस्टमचा वापर करून, आपण विविध कारणांसाठी वापरण्यासाठी आवाज ओळख मॉड्यूल लवचिकपणे कॉन्फिगर करू शकता. तर साधी नियंत्रणेमॉड्यूल आउटपुट पोर्ट पुरेसे नसल्यामुळे, व्हॉइस रेकग्निशन मॉड्यूल इतर उपकरणांशी UART किंवा GPIO द्वारे कनेक्ट केले जाऊ शकते. च्या साठी वायरलेस कनेक्शनआपण पूर्वी चर्चा केलेले मॉड्यूल वापरू शकता.

वायरलेस मॉड्युल वापरुन, तुम्ही व्हॉइस रेकग्निशन मॉड्युल आवश्यक असलेल्या कोणत्याही उपकरणांशी कनेक्ट करू शकता. उदाहरणार्थ, चला ते मायक्रोकंट्रोलरशी कनेक्ट करू, जे व्हॉइस कमांडच्या ओळखीबद्दल प्राप्त झालेल्या डेटावर आधारित एलईडी नियंत्रित करेल. वायरलेस मॉड्यूल्सडेटा दोन दिशेने हस्तांतरित करण्याची अनुमती द्या, म्हणून आवश्यक असल्यास, आपण मायक्रोकंट्रोलरसाठी प्रारंभ कोड लिहू शकता आवाज मॉड्यूलआणि व्हॉइस कमांडचे रेकॉर्डिंग. आमच्या बाबतीत, पीसी नियंत्रणाखाली, मॉड्यूलमध्ये आधीपासून अनेक व्हॉइस कमांड रेकॉर्ड केले जातात आणि पॉवर चालू केल्यावर ऑटोस्टार्ट करण्यासाठी ओळख कॉन्फिगर केली जाते, म्हणून मायक्रोकंट्रोलरसाठी आम्ही या डेटाच्या संदर्भात फक्त डेटा रिसेप्शन आणि एलईडी नियंत्रण नोंदणी करू. STM32F103C8T6 मायक्रोकंट्रोलर डेटा प्राप्त करण्यासाठी USART1 चा वापर करतो आणि आउटपुट म्हणून कॉन्फिगर केलेले PB10...PB15 पिन करतो, जे LEDs नियंत्रित करते. स्त्रोत कोड लेखाच्या शेवटी परिशिष्टात स्थित आहे.

परिणामांबद्दल थोडेसे

आवाज ओळखणे पूर्णपणे अचूक नाही. हे निवडलेल्या आदेशांवर आणि वापरकर्त्याच्या आवाजावर अवलंबून असते. चाचणी दरम्यान मला अनेक नकारात्मक गुण आढळले. मॉड्यूल कमांड शिकवताना, “एक” आणि “दोन” या व्हॉइस कमांड्स निवडल्या गेल्या. "दोन" कमांड नेहमी स्पष्टपणे पास होते, परंतु "एक" कमांडला "दोन" कमांड म्हणून ओळखले जाते आणि दुसऱ्या कमांडचा कोड त्यानुसार अंमलात आणला जातो. पुढे, इंग्रजीमध्ये व्हॉईस कमांड देण्याचा प्रयत्न करताना (आणि ते व्हॉइस मॉड्यूलमध्ये रेकॉर्ड केले गेले नाहीत), "एक" कमांड जवळजवळ नेहमीच "दोन" म्हणून परिभाषित केले गेले. कदाचित हे सर्व उच्चार, स्वर आणि मानवी आवाजाच्या इतर पैलूंबद्दल आहे जे बोललेल्या कमांड्सच्या व्हॉइस मॉड्यूल एन्कोडिंगसाठी अल्गोरिदममध्ये एम्बेड केलेले आहे. तथापि, या गुपिते उत्पादक मुक्त प्रवेशदेऊ नकोस. याव्यतिरिक्त, ओळखीच्या गुणवत्तेवर बाह्य आवाजाच्या परिस्थितीमुळे परिणाम होतो - रस्त्यावरचा आवाज, पंख्याचा आवाज, यादृच्छिक आवाज इ. निर्माता वस्तुस्थितीकडे लक्ष वेधतो उच्चस्तरीयओळख अचूकता आदर्श परिस्थितीत घडते. ॲम्प्लिफायरसह मायक्रोफोन वापरण्याची कल्पना अर्थातच डिव्हाइसची ऑपरेटिंग श्रेणी वाढवेल, परंतु यामुळे त्रुटींची शक्यता देखील वाढेल, कारण आवाजाच्या प्रवर्धनामुळे आवाज देखील वाढेल.

अखेरीस, जर तुमच्याकडे आवाज ओळखण्यासाठी आणि व्हॉईस कमांड्सच्या अंमलबजावणीसाठी कमी आवश्यकता असेल, तर हे मॉड्यूल प्रामाणिकपणे त्यावर खर्च केलेल्या पैशाचे काम करेल.

रेडिओ घटकांची यादी

पदनाम प्रकार संप्रदाय प्रमाण नोंददुकानमाझे नोटपॅड
IC1 MK STM32

STM32F103C8

1 नोटपॅडवर
VR1 रेखीय नियामक

AMS1117-3.3

1 नोटपॅडवर
MOD1, MOD3 वायरलेस मॉड्यूलHC-122 नोटपॅडवर
MOD2 आवाज ओळख मॉड्यूलVR3.11 नोटपॅडवर
Z1 क्वार्ट्ज8 MHz1
  • प्रक्रिया करत आहे
  • वेबसाइट विकास
  • कल्पना:

    कसा तरी आवाज काढायचा विचार आला Arduino नियंत्रण, पण एकटा Arduino पुरेसा नाही, कारण... स्मार्ट होम सिस्टमसाठी, तुम्हाला कॉम्प्युटर आणि त्याच्या सिस्टमशी संवाद साधण्याची देखील आवश्यकता आहे.

    उपाय शोधणे:

    BitVoicer
    मी समोर आलो विविध प्रकारचे Arduino सह संयोगाने BitVoicer वापरणारे लेख, परंतु समस्या अशी आहे की BitVoicer फक्त Windows वर कार्य करते, आणि हे सिस्टम वापरण्याची परवानगी देत ​​नाही. साधी उपकरणेजसे रास्बेरी पाई युनिक्स चालवत आहे.
    Arduino आवाज ओळख
    व्हॉईस रेकग्निशन मॉड्युलमुळे आर्डिनोला व्हॉईसद्वारे देखील नियंत्रित केले जाऊ शकते, परंतु आतापर्यंत मला ते विकत घेण्याचा आनंद नाही आणि हे मॉड्यूल वापरताना अनेक गैरसोयी आहेत: मर्यादित संख्या, कंटाळवाणा प्रशिक्षण, नवीन कमांड आवश्यक आहेत मॉड्यूल फ्लॅश करणे, जे सिस्टम डीबग केलेले आणि स्थापित केले असल्यास आधीच एक वजा आहे.

    उपाय

    मी क्रॉस-प्लॅटफॉर्म सोल्यूशन शोधण्यास सुरुवात केली जी सिस्टमला एकाधिक वर कार्य करण्यास अनुमती देईल ऑपरेटिंग सिस्टम. हे आढळले: Java/प्रोसेसिंगसाठी मजकूर लायब्ररीमध्ये भाषण. भाषेच्या आधारे कॉम्प्लेक्सची अंमलबजावणी केली जाते प्रक्रिया करत आहे (जावा)आणि Google स्पीच APIमांजर बद्दल आधीच लिहिले आहे. हा निर्णयरिअल-टाइम व्हॉइस ट्रॅकिंगला अनुमती देते ऑटोरेकॉर्ड सक्षम करा(), आवाज मर्यादा सूचित करा ऑटो थ्रेशोल्ड सक्षम करा(), कनेक्ट करा बाह्य मायक्रोफोन getLineIn(), ओळखीची भाषा निर्दिष्ट करा सेटभाषा(स्ट्रिंग). संपूर्ण यादीक्षमता आणि तपशील विकसकाच्या वेबसाइटवर आहेत: http://stt.getflourish.com. कार्य करण्यासाठी, आम्हाला Google Speech API की आवश्यक आहे. ते कसे मिळवायचे ते येथे वर्णन केले आहे: www.chromium.org/developers/how-tos/api-keys. फक्त नकारात्मक मुद्दा असा आहे की Google Speech तुम्हाला दररोज फक्त 50 विनंत्यांवर प्रक्रिया करण्याची परवानगी देते, परंतु प्रत्यक्षात 500 पेक्षा जास्त विनंत्यांवर प्रक्रिया केली जाते.

    भविष्यात मजकूर नेव्हिगेट करणे सोपे करण्यासाठी, मी सर्व स्त्रोत जोडत आहे, ज्यात आधीपासून व्हॉइस कमांड, अर्डिनो बोर्डचे कनेक्शन, स्केच अर्डिनो बोर्ड, वाक्प्रचारांची पुष्टी आणि इतर सर्व काही जे आता उपलब्ध आहे आणि कार्यरत आहे: स्त्रोत कोड. डाउनलोड केल्यानंतर, आम्ही GoogleTTS फोल्डर प्रोसेसिंग"एखाद्या लायब्ररीमध्ये ठेवतो. Arduino चे स्केच GoogleTTS/ArduinoSerial फोल्डरमध्ये आहे. सर्व काही प्रोसेसिंग 3.0a4 मध्ये लिहिलेले आहे, अधिकृत वेबसाइटवर प्री-रिलीझमध्ये उपलब्ध आहे.

    अंमलबजावणी("माझी आज्ञा ऐका!"):
    आम्ही ओळख ठरवले आहे. आता आपल्याला आवश्यक असलेल्या आज्ञा पकडून त्यावर निर्णय घेणे आवश्यक आहे. विभाग यासाठी जबाबदार आहे:
    void commands() ( if (result.equals("arduino")) ( // मॅच शोधत आहात // मॅच मिळाल्यावर कमांड कार्यान्वित करा) अन्यथा (result.equals("किती वेळ आहे")) ( / / मॅच प्राप्त झाल्यावर कमांड कार्यान्वित करा) )
    आवाज प्रतिसाद
    आता आम्हाला अशा साधनाची गरज आहे जी जुळल्यास मानवी आवाजात आम्हाला प्रतिसाद देईल. निवडलेले अंमलबजावणी साधन होते गूगल भाषांतर, किंवा त्याऐवजी एक मॉड्यूल जे मजकूर आवाजात रूपांतरित करते. मजकूर Google सर्व्हरला विनंती करून पाठविला जातो आणि मध्ये रूपांतरित केला जातो ध्वनी फाइलआणि mp3 स्वरूपात आम्हाला परत पाठवले. विभाग यासाठी जबाबदार आहे:
    void googleTTS(String txt, String language) ( // मजकूर googleTTS("text", "language" कमांड वापरून आवाजात रूपांतरित केला जातो) String u = "http://translate.google.com/translate_tts?tl="; u = u + भाषा + "&q=" + txt; u = u.replace(" ","%20"); URL url= नवीन URL(u); प्रयत्न करा ( URLConnection कनेक्शन = url.openConnection(); connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 1.1.4322; NET CLR 1.2.30703)"); connection.connect(); InputStream = connection.getInputStream(); फाइल f = नवीन फाइल(sketchPath + "/" + txt + ".mp3"); OutputStream out = new FileOutputStream( f); बाइट = नवीन बाइट; (len = is.read(bf)) : " + txt + ".mp3" ) पकडणे (IOException e) ( e.printStackTrace(); ) ) पकडणे (MalformedURLException e) ( e.printStackTrace(); ) )

    मजकूर वाक्यांशांवर थेट प्रक्रिया करण्यासाठी विभाग जबाबदार आहे:
    void voicer(String s) (// voicer("text") println(s) कमांडद्वारे कार्यान्वित; // मजकूराचे निरीक्षण करण्यासाठी वापरलेली फाइल f = नवीन फाइल(sketchPath + "/" + s + ".mp3"); // फाइल तपासत आहे // फाइल आधीच अस्तित्वात असल्यास, फाइल प्ले करा if(f.exists())( println("फाइल आधीच अस्तित्वात आहे! मी फाइल प्ले करत आहे!"); player = minim.loadFile(s) + ".mp3"); "ru"); player = minim.loadFile(s + ".mp3");

    ओळख आणि आवाज पुष्टीकरणाचे उदाहरण अंमलबजावणी:
    void commands() ( if (result.equals("computer")) ( // मॅच व्हॉइसर शोधत आहात("ऐका"); // व्हॉइस पुष्टीकरण प्राप्त करत आहे // मॅच प्राप्त करताना कमांड कार्यान्वित करा) )
    तो जिवंत आहे!

    प्रक्रिया + Arduino

    बरं, ते काम केले आहे असे दिसते, परंतु काहीतरी गहाळ आहे. आता Arduino सह “मित्र बनवू”.
    आम्ही Arduino ला डेटा पाठवण्यासाठी प्रोसेसिंगमध्ये सीरियल कनेक्शन सुरू करतो (साठी मॅक वापरकर्तेआणि युनिक्स):
    स्ट्रिंग पोर्टनेम = Serial.list(); myPort = नवीन मालिका (हे, पोर्टनेम, 9600); myPort.bufferUntil("\n");

    च्या साठी विंडोज वापरकर्ते:
    स्ट्रिंग मायपोर्ट = नवीन सीरियल (हे, "तुमचे COM पोर्ट", 9600); myPort.bufferUntil("\n");

    आणि व्हॉइस मॅच आढळल्यास आम्ही तेथे एक कमांड पाठवू:
    void commands() ( if (result.equals("लाइट चालू करा")) ( // जर व्हॉईस वाक्यांश "लाइट चालू करा" म्हणून ओळखला गेला असेल, तर myPort.write("उच्च") विनंती कार्यान्वित करा; / / सिरीयल कनेक्शन व्हॉइसरला हाय कमांड पाठवते ("लाइट चालू करा"); // कमांडच्या अंमलबजावणीचे व्हॉइस पुष्टीकरण ) अन्यथा (परिणाम. समान("लाइट बंद करा")) ( myPort.write("Low) "); // सीरियल कनेक्शन व्हॉइसरला लो कमांड पाठवते(" लाईट बंद करणे"); // पुष्टीकरण // मॅच प्राप्त झाल्यावर कमांड कार्यान्वित करा))

    आता सुरुवात करूया अर्डिनो बोर्ड. आम्हाला सीरियल पोर्ट ऐकण्याची गरज आहे आणि जेव्हा आम्हाला सूचीमधून कमांड सापडते, तेव्हा कमांडनुसार आवश्यक क्रिया करा. स्केच खूप सोपे आहे:
    int led = 13; // बोर्डवरील LED पिन शून्य सेटअप() ( Serial.begin(9600); // सिरीयल कनेक्शन पिनमोड (लेड, आउटपुट) सुरू करा; // एलईडी पिन डेटा प्रसारित करते) शून्य लूप() ( int i=0; / बफर चार बफरमध्ये स्ट्रिंग टाकण्यासाठी / व्हेरिएबल; // त्यात स्ट्रिंग टाकण्यासाठी बफर ॲरे जर (Serial.available())( // डेटा विलंब (100) च्या उपस्थितीसाठी सिरीयल पोर्ट तपासा; // जे वाचले होते ते बफरमध्ये टाका (Serial.available () && i< 99) { buffer = Serial.read(); } //закрываем массив buffer="\0"; String val = buffer; if (val == "High") { // Если получили значение High Serial.println("Led is On"); // Отправляем в Serial подтверждение получения digitalWrite(led, HIGH); // Включаем светодиод } if (val == "Low") { // Если получили значение Low Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения digitalWrite(led, LOW); // Выключаем светодиод } } }
    सर्व. चला तपासूया.

    समस्या आणि योजना:

    कारण मी या वेळेपूर्वी प्रोग्रामिंग केलेले नाही, मला डीबगिंग प्रक्रियेतील काही गोष्टी पूर्णपणे समजत नाहीत. खाली सूचीबद्ध केलेल्या समस्यांचे निराकरण कसे करावे हे कोणी मला सांगू शकल्यास मी आभारी आहे:

    सर्वात मूलभूत समस्या ही आहे की संपूर्ण व्हॉइस वाक्यांश बोलला जात नाही. अदृश्य शेवटची अक्षरे. जरी ध्वनी फाइल येते Google सर्व्हरसामान्य स्थितीत. मला परिस्थिती समजल्याप्रमाणे: ऑडिओ प्लेयरमध्ये एक समस्या आहे, परंतु नेमके कुठे हे अद्याप स्पष्ट नाही.
    - मी आधीच लिहिले आहे की Google Speech API मध्ये दररोज 50 विनंत्यांची मर्यादा आहे, परंतु प्रत्यक्षात ते अधिक होते. कोणत्याही परिस्थितीत, हे पुरेसे नाही. मी मुख्य कमांडची स्थानिक ओळख नोंदवण्याची योजना आखत आहे आणि ती ओळखल्यानंतरच, उर्वरित मजकूर Google द्वारे प्रक्रियेसाठी पाठवा, मी एक उपाय शोधत आहे.
    - मला वाटते की Arduino इथरनेट शील्डला कमांड पाठवण्यास त्रास होणार नाही, कारण... काही सिस्टीम होस्ट संगणकापासून बऱ्याच अंतरावर असू शकतात आणि सीरियल कनेक्शन यापुढे येथे कार्य करणार नाही. मी यापैकी एक दिवस हा निर्णय घेईन, कारण... माझ्याकडे Arduino ला इथरनेट शील्डसह कनेक्ट करण्यासाठी राउटर नाही.

    इतकंच! कृपया कोडच्या ओळींवर आधारित काटेकोरपणे न्याय करू नका! मी नुकतेच या स्प्रिंगबोर्डचा अभ्यास करण्यास सुरुवात केली आहे आणि आपण काय करू नये याबद्दल माझे नाक घासल्यास आणि ते कसे करावे हे मला दाखवल्यास मी अत्यंत आभारी आहे. इतर इच्छुक पक्ष या प्रकल्पात सामील झाल्यास मला देखील आनंद होईल - मी नेहमी संवादासाठी खुला असतो!

    शीर्षकानुसार, हा लेख मायक्रोकंट्रोलरवरील संख्या ओळखण्यावर लक्ष केंद्रित करेल. मी लगेच आरक्षण करू इच्छितो की हा लेख प्रदान करणार नाही स्रोत, तंत्रज्ञान किंवा ओळख अल्गोरिदम मानले जाते, मी फक्त असे म्हणेन की कल्पना वापरल्या जातात पद्धतशीर दृष्टीकोन. त्यापैकी काही आमच्या लेखांमध्ये (आणि येथे) रेखांकित आहेत. हे या वस्तुस्थितीमुळे आहे की आमचा दृष्टिकोन मौलिकतेसाठी प्रयत्न करतो, परंतु काही समस्यांचे स्पष्टीकरण आवश्यक आहे.कोणीतरी म्हणेल: "प्रोग्रामिंग मायक्रोकंट्रोलर्सबद्दल दुसरा लेख." अजिबात नाही, तत्सम प्रकल्पांच्या शोधाने याशिवाय कोणतेही स्पष्ट परिणाम दिले नाहीत व्हिडिओ. मंचांवरील चर्चांमधून, एक गोष्ट स्पष्ट आहे: असे डिव्हाइस मिळविण्याची कल्पना (कॅमेरा + मायक्रोकंट्रोलर = आउटपुट ओळख परिणाम, आणि केवळ कॅप्चर केलेले चित्र नाही) बर्याच लोकांना आली, परंतु अंमलबजावणीशिवाय राहिली. आणि ओळख, सर्व खात्यांनुसार, खूप आवश्यक आहे संगणकीय संसाधनेआणि मायक्रोकंट्रोलर्स यासाठी योग्य नाहीत, विशेषतः Arduino बद्दल असे विधान होते की हे सहसा अशक्य आहे. आपल्याला स्वारस्य असल्यास, कृपया मांजर पहा.

    कोणतेही स्पष्ट प्रश्न टाळण्यासाठी, त्यांची उत्तरे देऊ:

    • नाही, ही प्रतिमा ओळखण्याची सेवा नाही.
    • नाही, हे OpenCV नाही
    • नाही, हे न्यूरल नेटवर्क नाहीत
    • होय, ओळख मायक्रोकंट्रोलरद्वारे केली जाते!

    कल्पना

    थोडक्यात, हे सर्व माझ्या हाताने प्रयत्न करण्याच्या इच्छेने सुरू झाले आणि प्रतिमा ओळखण्यासाठी माझ्या कल्पनांची चाचणी घ्या. चर्चेदरम्यान आम्ही निष्कर्षापर्यंत पोहोचलो की आम्ही लहान गोष्टींसह मिळवू शकतो संगणकीय शक्तीया समस्येचे निराकरण करण्यासाठी. स्पष्ट कारणांमुळे, आम्ही या चर्चांचे तपशील वर्णन करणार नाही.

    स्थापना

    तर, कार्य निश्चित केले आहे, अंमलबजावणी आवश्यक आहे. आधीच स्थापित केलेल्या तत्त्वांपासून विचलित न होता
    आमच्या हातात जे आहे ते आम्ही घेतो. आणि माझ्याकडे दोन Arduino Unos, एक जुना ऑप्टिकल माऊस आणि एक CD ड्राइव्ह हातात होता. तसे, तुम्ही सेन्सर कशासाठी वापराल? ऑप्टिकल माउसप्रतिमा मिळविण्यासाठी कॅमेरा म्हणून, आम्हाला आम्ही बर्याच काळापूर्वी वाचलेल्या एखाद्या गोष्टीद्वारे आणि खरं तर, उर्वरित सर्व "माऊस" सामग्रीद्वारे सूचित केले गेले होते. आम्हाला फक्त सेन्सर आणि त्याचा संपूर्ण हार्नेस वापरण्यास सोप्यासाठी अनसोल्डर करायचा होता आणि त्यावर एक लेन्स चिकटवायचा होता, जो आम्ही सीडी ड्राइव्हमधून काळजीपूर्वक "फाडला" होता. विषयापासून कॅमेऱ्यापर्यंतचे अंतर वाढवण्यासाठी हे आवश्यक होते, अन्यथा आमच्या आकाराचे आकडे बसणार नाहीत आणि फक्त लहान भाग. तसे, आम्ही सीडी ड्राइव्हवरून लेन्सच्या समोर वेब कॅमेऱ्यामधून ऑप्टिक्स जोडण्याचा प्रयत्न केला, परंतु कसा तरी ते कार्य करत नाही.


    अधिक



    मग हा कॅमेरा विषयावर कसा लावायचा हा प्रश्न निर्माण झाला. येथे आम्हाला जुन्या तुटलेल्या सूक्ष्मदर्शकाने खूप मदत केली जी निष्क्रिय पडली होती. आम्ही आदरपूर्वक त्यातून स्टेज नियंत्रण यंत्रणा काढून टाकली. या यंत्रणेमुळे आम्हाला कॅमेरा फक्त दोन अक्षांसह हलवता आला; लेसर डोकेसीडी ड्राइव्हवरून. हे सर्व दीर्घकाळ सहन करणाऱ्या सीडी ड्राइव्हच्या बाबतीत सुरक्षित होते. परिणामी, आम्हाला एक छान कॅमेरा पोझिशनिंग यंत्रणा मिळाली.


    अधिक




    एकूण: आमच्याकडे एक तथाकथित कॅमेरा आहे, एक पोझिशनिंग मेकॅनिझम आहे, फक्त कागदाचा तुकडा एका नंबरसह ठेवणे आणि कॅमेऱ्यामधून प्रतिमा मिळवणे बाकी आहे. येथूनच "समस्या" सुरू झाल्या. "माऊस" च्या वैशिष्ट्यांमुळे ऑप्टिकल सेन्सरकॅमेरा म्हणून वापरण्यासाठी फारच दुर्मिळ, त्यांनी प्रदीपनसह सुधारणा करण्यास सुरुवात केली.


    अधिक




    हे स्पष्ट झाले की केवळ तीव्रता हायलाइट करणे शक्य होणार नाही बाह्य प्रकाशाची दिशा देखील समायोजन करते. बॅकलाइटची तीव्रता नियंत्रित करण्यासाठी मला दुसरा Arduino चालू करावा लागला ( स्वाभाविकच, ते वेगळ्या पद्धतीने नियंत्रित करणे शक्य होते, परंतु नंतर केवळ बॅकलाइटद्वारेच नव्हे तर निर्देशकावरील क्रमांक स्विच करून देखील.). सरतेशेवटी, असे दिसून आले की प्रकाशात शूटिंग करणे अधिक चांगले आहे. आणि जर, उदाहरणार्थ, आपण लक्ष्य म्हणून चमकणारा सात-सेगमेंट निर्देशक वापरत असल्यास, सेन्सर ते उत्तम प्रकारे पाहतो. तर आता आमच्याकडे चित्रीकरणाच्या वस्तू म्हणून काळ्या पार्श्वभूमीने भरलेल्या पांढऱ्या अंकांसह एक सूचक आणि एक पट्टी आहे.


    डावीकडे इंडिकेटरमधून प्राप्त केलेली ग्रेस्केल प्रतिमा आहे (आम्हाला सेन्सरकडून अशी प्रतिमा प्राप्त होते), उजवीकडे बायनराइज्ड आहे.


    अधिक



    एकत्रित स्थापनेचे सामान्य दृश्य



    लवकर स्थापना पर्याय





    ओळख ब्लॉक


    आमच्या स्थापनेत महत्वाची भूमिका तथाकथित ओळख युनिटद्वारे खेळली जाते (वरील चित्रात). तुम्ही बघू शकता, त्यात Arduino Uno आणि एक सुप्रसिद्ध वायफाय ट्रान्समीटर आहे ESP8266. मला समजावून सांगा, टॅब्लेटवर ओळख परिणाम पाहण्यासाठी आम्हाला वायफाय ट्रान्समीटरची आवश्यकता आहे. टॅब्लेटवरील ॲप्लिकेशन विनंती पाठवते, आर्डिनो, विनंती प्राप्त झाल्यावर, माउस सेन्सरवरून प्रतिमा “कॅप्चर” करते, नंतर ती बायनराइज करते. बायनरायझेशन नंतर, ओळख होते आणि ते पूर्ण झाल्यानंतर, एक प्रतिसाद व्युत्पन्न होतो. प्रतिसादात, आम्ही टॅब्लेट स्क्रीनवर बायनराइज्ड प्रतिमा तयार करण्यासाठी ओळख परिणाम आणि 41 बाइट्स पाठवतो, म्हणजे स्पष्टतेसाठी.

    आपण मागे वळून पाहिल्यास, Arduino मध्ये काही चांगली कार्यक्षमता आहे: कॅमेरासह कार्य करणे, ओळखणे आणि esp8266 सह कार्य करणे. कामावर परिणाम होऊ शकला नाही तर स्मरणशक्तीच्या कमतरतेचा सामना करावा लागला. मी कधीही विचार केला नव्हता की मला कधीही मेमरीच्या प्रत्येक बाइटवर पुन्हा दावा करावा लागेल.

    ओळख प्रक्रियेचे प्रात्यक्षिक

    निष्कर्षाऐवजी

    इतकंच. अजून खूप काम बाकी आहे. आणि पहिले कार्य: “मानवी” कॅमेऱ्याने (आणि “माऊस सेन्सर” नव्हे) कॅप्चर केलेले संख्या (संख्यांचे तार) ओळखणे आणि विकसित तंत्रज्ञान ESP8266 मध्ये हस्तांतरित करणे आणि मेमरीच्या प्रत्येक बाइटसाठी संघर्षाची तीव्रता कमी करणे.

    आम्हाला तुमच्या प्रश्नांची उत्तरे देण्यात आनंद होईल.



    आम्ही वाचण्याची शिफारस करतो

    वर