अपना स्वयं का आवाज पहचान कोड लिखना [बंद]


17

समस्या का विवरण

मैं एक हार्डवेयर प्रोजेक्ट के हिस्से के रूप में वॉइस रिकग्निशन का उपयोग करना चाहता हूं, जिसे मैं पूरी तरह से स्व-युक्त होना चाहता हूं (मैं छोटी कम शक्ति का उपयोग कर रहा हूं, कम गति वाले उपकरण जैसे कि Arduino's और Raspberry Pi's, Kinects आदि, कोई भी पारंपरिक कंप्यूटर नहीं चल रहा है एक OS शामिल है। इसलिए एक बंद / स्वयं युक्त परियोजना)।

आवाज पहचान आप चाहते हैं परिष्कार के स्तर के आधार पर बहुत जटिल हो सकता है। मेरे पास वही है जो मेरा मानना ​​है कि आवश्यकताओं का तुलनात्मक सरल सेट है। मैं केवल अपनी खुद की आवाज पहचानना चाहता हूं, और मेरे पास 20 या उससे छोटे शब्द हैं, जिन्हें मैं पहचानना चाहता हूं। इस प्रकार मुझे जटिल भाषण-से-पाठ और आवाज मान्यता पुस्तकालयों या किसी भी उत्कृष्ट 3 पार्टी सॉफ्टवेयर की आवश्यकता नहीं है जो मुझे इंटरनेट खोज इंजन के माध्यम से मिलें (इनमें कोई कमी नहीं है!)। मेरा मानना ​​है कि मेरी आवश्यकताएं "सरल पर्याप्त" (कारण के भीतर) हैं जो मैं अपने समाधान का कोड कर सकता हूं। मैं सोच रहा हूं कि क्या किसी ने भी इस तरह की अपनी प्रक्रिया लिखी है, और क्या मेरा तरीका व्यापक रूप से त्रुटिपूर्ण है? क्या गणित के उच्च स्तर की आवश्यकता के बिना ऐसा करने का एक बेहतर तरीका है या एक जटिल एल्गोरिदम लिखना है? यही वह समाधान है जो मैंने नीचे सोचने की कोशिश की है।

समाधान का वर्णन

मैं सी में यह लिख रहा हूं, लेकिन मैं एक भाषा अज्ञेय प्रक्रिया पर चर्चा करना चाहता हूं, जो इस प्रक्रिया पर ध्यान केंद्रित करता है। तो चलो अनदेखा कर देते हैं कि अगर हम कर सकते हैं।

1 है। मैं बोले जा रहे लोगों से मेल करने के लिए अपने शब्दों के शब्दकोश को पूर्व-रिकॉर्ड करूंगा। हम कल्पना कर सकते हैं कि मेरे पास मेरे 20 अलग-अलग शब्दों की 20 रिकॉर्डिंग हैं, या शायद छोटे वाक्यांश या दो या तीन शब्दों के वाक्य हैं। मेरा मानना ​​है कि यह दो रिकॉर्डिंग फ़ाइलों की तुलना करने की प्रक्रिया को वास्तव में ऑडियो को टेक्स्ट में परिवर्तित करने और दो स्ट्रिंग्स की तुलना करने की प्रक्रिया को आसान बनाता है।

२।एक माइक्रोफोन मेरे कोड को चलाने वाले मेरे हार्डवेयर डिवाइस से जुड़ा है। [1]। कोड लगातार निश्चित लंबाई के नमूने ले रहा है, उदाहरण के लिए लंबाई में 10msec और एक गोलाकार लॉग शैली में उदाहरण के लिए लगातार 10 नमूने संग्रहीत करने का कहना है। [2]। (मैं अपने सिर के ऊपर से इन आंकड़ों का आविष्कार कर रहा हूं ताकि वे इस प्रक्रिया का वर्णन करने के लिए केवल उदाहरण हैं)।

[१] यह संभवत: एक बैंड-पास फिल्टर और ऑप-एम्प के माध्यम से जुड़ा होगा, जैसा कि शब्दकोश रिकॉर्डिंग बनाया जाएगा, संग्रहीत और एकत्र ऑडियो नमूनों को छोटा रखने के लिए।

[२] मुझे यकीन नहीं है कि मैं एक नमूना कैसे लूंगा, मुझे एक विधि पर काम करने की आवश्यकता है, हालांकि मैं एक संख्यात्मक आंकड़ा (पूर्णांक / फ्लोट / डबल) का उत्पादन कर रहा था जो १० एमएमसी नमूने के ऑडियो का प्रतिनिधित्व करता है (शायद एक सीआरसी मान या ऑडियो नमूने के एमडी 5 योग), या आंकड़ों की एक धारा (शायद आवृत्तियों के ऑडियो रीडिंग की एक धारा)। अंततः एक "नमूना" एक संख्यात्मक आंकड़ा या आंकड़े होंगे। यह हिस्सा बहुत अधिक हार्डवेयर से जुड़ा होने वाला है इसलिए वास्तव में यहाँ चर्चा के लिए नहीं है।

३। कोड यह देखता है कि यह लगातार 10 नमूने संग्रहीत है और किसी शब्द या वाक्यांश को इंगित करने के लिए वॉल्यूम में वृद्धि के लिए लग रहा है (मौन से विराम) और फिर उदाहरण के लिए 500 नमूने कहने के लिए लगातार नमूना संग्रह बढ़ रहा है। इसका मतलब है कि यह 10 मिसे नमूने में 5 सेकंड के ऑडियो को कैप्चर करेगा।

यह ये नमूने या "स्लाइस" हैं जिनकी तुलना संग्रहीत ध्वनि और कैप्चर की गई ध्वनि के बीच की जाती है। यदि कैप्चर किए गए नमूनों का उच्च प्रतिशत समान संग्रहीत लोगों से मेल खाता है, तो कोड उसी शब्द को मानता है।

The start of a store recording of the world "hello" for example,
stored words are split into 10 msec samples also

Stored Sample No           | 1| 2| 3| 4| 5| 6| 7|  8|
Stored Sample Value        |27|38|41|16|59|77|200|78|

Incoming audio (me saying "hello") with some "blank" samples
at the start to symbolise silence

Incoming Sample No         | 1| 2| 3| 4| 5| 6| 7| 8| 9|10| 11|12|
Incoming Sample Value      |  |  |  |20|27|38|46|16|59|77|200|78|

४। एक बार जब कोड ने एक पूर्ण नमूना स्ट्रीम एकत्र कर लिया है, तो यह निम्न ऑडियो रिकॉर्डिंग का उत्पादन करने के लिए प्रारंभ में रिक्त नमूनों को काट देता है। यह नमूना सेट को पीछे की ओर भी ले जा सकता है और संग्रहीत नमूने के साथ बेहतर संरेखित करने के लिए कुछ स्थानों को आगे पीछे कर सकता है।

यह नीचे की तरह एक नमूना सेट का उत्पादन करता है:

Stored Sample No           | 1| 2| 3| 4| 5| 6|  7| 8|
Stored Sample Value        |27|38|41|16|59|77|200|78|

Incoming Sample No      |-1| 1| 2| 3| 4| 5| 6|  7| 8|
Incoming Sample Value   |20|27|38|46|16|59|81|201|78|

५। मेरा मानना ​​है कि प्रत्येक नमूना कितना पास होना चाहिए, इसका प्रतिशत मूल्य है, इसलिए नमूना 7 1 के मूल्य से भिन्न होता है जो कि% 1 से कम है, और नमूनों की कुल संख्या के लिए प्रतिशत मूल्य जो उनके नमूना मिलान प्रतिशत के भीतर होना चाहिए। कोड में सटीकता का आसानी से ट्यून करने योग्य स्तर है।

मैंने पहले कभी ऑडियो के साथ ऐसा कुछ नहीं किया, यह बहुत काम आ सकता है। यही कारण है कि मैं यह प्रश्न पूछ रहा हूं, यदि आप पहले से ही इस प्रश्न का उत्तर स्पष्ट जानते हैं (जो कभी भी उत्तर हो सकता है)। मुझे उम्मीद है कि यह एक कम्प्यूटेशनल रूप से बड़े पैमाने पर कार्य नहीं होगा क्योंकि कुछ हार्डवेयर जो मैं उपयोग कर रहा हूं, वे कम सेकंड सामान होंगे। सैकड़ों मेगाहर्ट्ज़ में (शायद 1Ghz एक ओवर-क्लॉक्ड रास्प पाई का उपयोग करके)। इसलिए यह कम कम्प्यूटेशनल शक्ति का उपयोग करते हुए ऑडियो नमूनों का मिलान करने के लिए एक कच्चा तरीका है। मैं तात्कालिक परिणामों के लिए लक्ष्य नहीं बना रहा हूं, लेकिन अवधारणा के एक सभ्य प्रमाण के लिए 30 सेकंड से भी कम समय।

PS मुझे "ऑडियो", "ऑडियो रिकॉग्निशन", "वॉयस", "वॉयस रिकॉग्निशन" आदि जैसे नए टैग के साथ इसे टैग करने का रेप नहीं है


17
वीआर सुंदर बहुत जटिल है, और मुझे संदेह है कि क्षेत्र में ज्ञान के बिना किसी को बहुत अधिक पढ़ने के बिना बहुत अधिक मार्ग बनाने में सक्षम होना चाहिए। पहली बात जो मुझे आपके एल्गोरिथ्म के बारे में बताती है, वह यह है कि एक शब्द को कितनी तेजी से बोला जाता है, यह मतभेदों को संभाल नहीं पाएगा। यहां तक ​​कि सरल वीआर को सही होने में कई साल लग गए।
रोबोट23

4
वास्तव में। जब तक आप विकास में मन नहीं लगाते, तब तक आप अपने लक्ष्य को संकलित करने वाले पुस्तकालयों को देखना चाहेंगे। मुझे यकीन है कि वे मौजूद हैं।
रिग

6
मैं एक अतिरिक्त कदम सुझाता हूं - प्रत्येक नमूने का एक फूरियर रूपांतरण करें। यह आपको सीधे नमूनों के साथ काम करने के बजाय समय के साथ प्रत्येक ऑडियो आवृत्ति की तीव्रता देता है। स्वरों के लिए एक यथोचित सुसंगत मौलिक आवृत्ति होगी जिसे आप सामान्य रूप से बोलते हैं जिस पर आप पता लगा सकते हैं। आपको केवल ऑडियो ही नहीं, बल्कि भाषण की विशिष्ट विशेषताओं को भी देखना होगा। जैसा कि दूसरों ने कहा है, यह एक मुश्किल काम है।
पॉल एंडरसन

1
मेरा सुझाव है कि आप कुछ ध्वनि पहचान पुस्तकालयों के साथ खेलने की कोशिश करें, भले ही आप उन्हें अंतिम उत्पाद के लिए उपयोग न कर सकें। वे अवधारणा का प्रमाण बनाने के लिए उपयोगी होंगे।
SAV

जवाबों:


3

वैसे मुझे नहीं लगता कि ऐसा करने के लिए Arduino में घोड़े की शक्ति है। 16Mhz An Arduino में इसके संचालन में लगभग 32K मेमोरी है। यहां तक ​​कि Mp3 (छोटे तब wav) में भी 20 शब्द सम्‍मिलित हैं, केवल अपनी ही आवाज के बावजूद, इसमें फिट नहीं होगा।

रासबेरी पी चाल कर सकता है, इसका संचालन 700 मेगाहर्ट्ज पर हो सकता है संस्करण के आधार पर इसमें 512 एमबी मेमोरी हो सकती है। वह अभी भी बहुत अधिक आटा नहीं है।

आपको एक फूरियर ( http://www.drdobbs.com/cpp/a-simple-and-efficient-fft-implementatio/199500857 ) की आवश्यकता हो सकती है

या यदि आप वॉल्यूम का उपयोग करने का इरादा रखते हैं, तो पिछले नमूनों जैसे
x = (x + x [n-1] + x [n-2] + x [n-3]) / 4 // जैसे कुछ साधारण से कुछ औसत करें और चाहिए

एक अगली चीज़ जो आपको करने की ज़रूरत है, मुझे लगता है कि अगर आप इन एक्स वैल्यूज़ को प्लॉट करेंगे, तो आपको उस लाइन के किसी प्रकार के ढलान का पता लगाने की आवश्यकता है क्योंकि वॉल्यूम के आधार पर कमांड का पता लगाना निर्भर करता है, अन्यथा बहुत दूरी पर निर्भर करता है, जबकि आप इसके पैटर्न का पता लगाना चाहते हैं शब्द

फिर यह थोड़ा निर्भर करता है कि ढलान को कैसे रिकॉर्ड किया जाए ताकि पैटर्न दूसरी बार फिट हो। मेरा मतलब है कि एक कंप्यूटर सही गति से नहीं बोल सकता है और ढलान थोड़ा स्थिर हो सकता है। अंत में मुझे लगता है कि यह थोड़ा सा है कि वे रेखाएँ कितनी खड़ी हैं और उनकी लंबाई y अक्ष, किसी औसत के भीतर होनी चाहिए


1
  1. Arduino और रास्पबेरी पाई उन पर छोटे चिप्स के साथ प्रोटोटाइप बोर्ड हैं। आपको पहले चिप पर ध्यान केंद्रित करना चाहिए। डीएसपी (डिजिटल सिग्नल प्रोसेसिंग) टूलबॉक्स के साथ कुछ देखें, हो सकता है कि आपके पास पहले से ही डीएसपी टूलबॉक्स हो और उसे पता न हो। डीएसपी टूलबॉक्स में फास्ट फ्रिक्वेंसी डोमेन विश्लेषण के लिए fft (फास्ट फूरियर ट्रांसफॉर्म) और ifft (उलटा fft) जैसे कॉल पर एल्गोरिदम होते हैं।

  2. अपनी प्रोग्राम शैली पर ध्यान दें: क्या आपके नमूने ढेर या कतार में हैं? आप इस प्रकार के डेटा के लिए एक कतार चाहेंगे। एक कतार की तरह दिखता है:

    Position NO --|1|2|3|4|5|6|7|8|
    Sample Value  |5|7|9|1|2|2|9|8|
    

    अगला पुनरावृत्ति:

    Position NO --|1|2|3|4|5|6|7|8|
    Sample Value  |0|5|7|9|1|2|2|9|
    ->  First in First out (FIFO)
    

    ध्यान दें कि चीजें 'सही' की ओर कैसे स्थानांतरित होती हैं? मुझे लगता है कि आपने "परिपत्र" एल्गोरिदम का वर्णन किया है। बस दूसरे सबसे पुराने नमूनों के साथ सबसे पुराने नमूनों को अधिलेखित करें, फिर तीसरे सबसे पुराने के साथ दूसरे सबसे पुराने नमूनों को अधिलेखित करें ..., कतार की शुरुआत के सभी तरीके जहां आप अपना नया डेटा सम्मिलित करते हैं।

  3. "कोड लगातार निश्चित लंबाई के नमूने ले रहा है, 10msec का कहना है" <- गलत इस तरह से सोचें: कोड विवेकपूर्ण रूप से मात्रा (ऊंचाई) के नमूने ले रहा है, प्रति सेकंड 10000 नमूनों की नमूना दर पर, जो प्रत्येक नमूने को 0.1 एमएस से अलग करता है।

    आपकी नमूना आवृत्ति क्या है? आपके क्वांटाइज़र पर बिटरेट क्या है? कम संख्या आपको स्मृति मुक्त करने में मदद करेगी। मैं सुझाव दूंगा कि कम नमूना दर जैसे 6600 नमूने प्रति सेकंड (Nyquist)। मुझे संदेह है कि मान्यता के लिए 4 बिट (16 स्तर) पर्याप्त होगा। तो प्रति सेकंड रिकॉर्डिंग के 3300 बाइट्स thats। अब 3300 हर्ट्ज (टेलीफोनी फिल्टर) के ऊपर सब कुछ fft और delete करें। अब आपके पास एक सेकंड के साउंड के लिए 1650 बाइट्स हैं। ये डीएसपी ट्रिक्स बहुत मेमोरी को बचाएंगे।

    मुझे नहीं पता कि कौन सोचता है कि 512 एमबी छोटा है। उपरोक्त जानकारी के साथ रिकॉर्डिंग के 300,000+ सेकंड ... 3 दिन से अधिक ठोस।

  4. मुझे लगता है कि आपको आवाज पहचान करने के लिए एक बेहतर वातावरण होने के लिए आवृत्ति डोमेन (एफएफटी का उपयोग करके) मिलेगा।

मुझे आशा है कि मैंने आपको बुरा भ्रमित नहीं किया :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.