2011-08-23 26 views
14

मेरा आवेदन रिकॉर्ड AsyncTask में और भी पाठ में भाषण को बदलने गूगल एपीआई का उपयोग MediaRecorder वर्ग का उपयोग कर ऑडियो - पहचानकर्ता आशय - इस सवाल से कोड का उपयोग: How can I use speech recognition without the annoying dialog in android phonesएंड्रॉयड भाषण पहचानने और एक ही समय में ऑडियो रिकॉर्डिंग

मैं कोशिश की है थ्रेड में ऑडियो रिकॉर्ड करने के लिए, लेकिन यह भी खराब समाधान है। इससे अधिक समस्याएं होती हैं। मेरी समस्या यह है कि मेरा आवेदन एम्यूलेटर पर ठीक से काम करता है। लेकिन एमुलेटर ध्वनि पहचान सेवाओं की कमी के कारण भाषण पुन: पहचान का समर्थन नहीं करता है। और मेरे डिवाइस पर अपने आवेदन दुर्घटना जब मैं ऑडियो और भाषण reognizing रिकॉर्डिंग शुरू होता है - "अप्रत्याशित रूप से बंद हो गया है"। हालांकि जब मेरे पास वाईफाई बंद हो जाती है, तो एप्लिकेशन एमुलेटर पर ठीक तरह से काम करता है।

रिकॉर्डिंग ऑडियो AndroidManifest में की आवश्यकता है:

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

और वाक् पहचान requiers:

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

मुझे लगता है यह एक ऑडियो इनपुट के साथ समस्या है? मैं यह मुश्किल कैसे सुलझाऊँ? गूगल वाक पहचानकर्ता requiers मुख्य यूआई सूत्र में काम करने के लिए, तो मैं उदाहरण के लिए यह Async कार्य में नहीं कर सकते हैं। तो मेरे पास Async कार्य में ऑडियो रिकॉर्डिंग है। मुझे नहीं पता कि यह समस्या क्यों पैदा करता है।

मैं ग्रहण करने के लिए अपने डिवाइस से कनेक्ट कर दिया और मैं USB डीबगिंग इस्तेमाल किया है।

08-23 14:50:03.528: ERROR/ActivityThread(12403): Activity go.android.Activity has leaked ServiceConnection [email protected] that was originally bound here 
08-23 14:50:03.528: ERROR/ActivityThread(12403): android.app.ServiceConnectionLeaked: Activity go.android.Activity has leaked ServiceConnection [email protected] that was originally bound here 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread$PackageInfo$ServiceDispatcher.<init>(ActivityThread.java:1121) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread$PackageInfo.getServiceDispatcher(ActivityThread.java:1016) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ContextImpl.bindService(ContextImpl.java:951) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.content.ContextWrapper.bindService(ContextWrapper.java:347) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.speech.SpeechRecognizer.startListening(SpeechRecognizer.java:267) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at go.android.Activity.startRecordingAndAnimation(Activity.java:285) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at go.android.Activity.onResume(Activity.java:86) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1151) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.Activity.performResume(Activity.java:3823) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.os.Looper.loop(Looper.java:123) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
08-23 14:50:03.528: ERROR/ActivityThread(12403):  at dalvik.system.NativeStart.main(Native Method) 

और वह एक और अपवाद के बाद:: और यह execption मैं LogCat में है

08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412): Failed to create session 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412): com.google.android.voicesearch.speechservice.ConnectionException: POST failed 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.SpeechServiceHttpClient.post(SpeechServiceHttpClient.java:176) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.SpeechServiceHttpClient.post(SpeechServiceHttpClient.java:88) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.ServerConnectorImpl.createTcpSession(ServerConnectorImpl.java:118) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.ServerConnectorImpl.createSession(ServerConnectorImpl.java:98) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.RecognitionController.runRecognitionMainLoop(RecognitionController.java:679) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.RecognitionController.startRecognition(RecognitionController.java:463) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.RecognitionController.access$200(RecognitionController.java:75) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.RecognitionController$1.handleMessage(RecognitionController.java:300) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at android.os.Looper.loop(Looper.java:123) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at android.os.HandlerThread.run(HandlerThread.java:60) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412): Caused by: java.net.SocketTimeoutException 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:564) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:88) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:191) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:82) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:174) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:179) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:235) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:259) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:279) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:121) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:410) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at android.net.http.AndroidHttpClient.execute(AndroidHttpClient.java:243) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  at com.google.android.voicesearch.speechservice.SpeechServiceHttpClient.post(SpeechServiceHttpClient.java:167) 
08-23 14:50:08.000: ERROR/ServerConnectorImpl(12412):  ... 10 more 
08-23 14:50:08.000: ERROR/RecognitionController(12412): Ignoring error 2 
+0

में मैं बिल्कुल वही चीज़ करते कोशिश कर रहा हूँ ऊपर 2 परियोजनाओं के लिए कम से कम मर्ज देखें। लेकिन ऐसा लगता है कि केवल एक आवेदन रिकॉर्डिंग ऑडियो हो सकता है। क्या आपको सफलता मिली है?अब मैं ऑडियो रिकॉर्ड करने की कोशिश कर रहा हूं और इसे वॉयस पहचानकर्ता को भेजने के लिए कुछ हैक कर रहा हूं, लेकिन यह RECOGNIZE_SPEECH को प्रतिक्रिया देने वाली गतिविधि या सेवा को ढूंढने के लिए जटिल है। –

+1

मैंने इस समाधान का परीक्षण नहीं किया है लेकिन शायद एक संभावना है। Http://developer.android.com/reference/android/speech/RecognitionService.Callback.html में विधि 'शून्य बफर प्राप्त किया गया है (बाइट [] बफर) '। संभावित समाधान ऑडियो रेकॉर्ड एंड्रॉइड क्लास में इस प्राप्त बफर को सहेजना है। इसमें 'रीड (बाइट [] ऑडियोडेटा, इंट ऑफ़सेटइनबाइट्स, इंट साइज इनबाइट्स) जैसी विधि है। तो शायद इस तरह की दो उपयोगिताओं को इस तरह से जोड़ना संभव है? ऑडियो रिकॉर्डिंग को कॉन्फ़िगर करने और रिकॉर्डिंग के बाद परिणाम एमपी 3 या WAV प्रारूप में कनवर्ट करने के साथ समस्याएं हो सकती हैं। – woyaru

+0

किसी के पास कोई भाग्य है? आवाज रिकॉर्डिंग की प्रतिलिपि बनाने के लिए यह बहुत उपयोगी होगा। पाठ फ़ाइल में भाषण बनाएं, लेकिन फिर इसे सत्यापित करने के लिए ध्वनि रिकॉर्डिंग को वापस चलाने में सक्षम हो। –

उत्तर

0

मैं अभी तक इस समाधान का परीक्षण नहीं किया लेकिन शायद वहाँ एक संभावना है। http://developer.android.com/reference/android/speech/RecognitionService.Callback.html में विधि void bufferReceived(byte[] buffer) है। संभव समाधान AudioRecord एंड्रॉयड कक्षा में इस recived बफर को बचाने के लिए है। इसमें read(byte[] audioData, int offsetInBytes, int sizeInBytes) जैसी विधि है। तो शायद इस तरह की दो उपयोगिताओं को इस तरह से जोड़ना संभव है? AudioRecord को कॉन्फ़िगर करने और रिकॉर्डिंग के बाद परिणाम एमपी 3 या WAV प्रारूप में कनवर्ट करने के साथ समस्याएं हो सकती हैं।

+3

दुर्भाग्यवश इस विधि को हर डिवाइस द्वारा (बिल्कुल नहीं) कहा जाता है, इसलिए आपको कोई भी ऑडियो डेटा प्राप्त होने की गारंटी नहीं है। यह एक दुखद और निराशाजनक परिणाम है, क्योंकि हमने इस सुविधा का लाभ हमारे डिक्टेशन लेने वाले ऐप, डिक्टेटर में लेने का प्रयास किया है। साथ ही, इस डेटा का प्रारूप और नमूना दर औपचारिक रूप से परिभाषित नहीं है, लेकिन यह आमतौर पर (8KHz लेकिन कार्यान्वयन-निर्भर) 16-बिट मोनो जैसा दिखता है। –

3

देर से उत्तर, लेकिन पहली अपवाद के लिए, आपको इसके बाद अपने स्पीच रिकॉग्नाइज़र को नष्ट करना होगा, उदाहरण के लिए (ऑनस्टॉप() या ऑनस्ट्रोय() में या सीधे आपको स्पीच रिकॉग्नाइज़र की आवश्यकता नहीं होने के बाद) :

if (YourSpeechRecognizer != null) 
    { 
     YourSpeechRecognizer.stopListening(); 
     YourSpeechRecognizer.cancel(); 
     YourSpeechRecognizer.destroy(); 
    } 
6

मैं एक समाधान है कि अच्छी तरह से भाषण पहचानने और ऑडियो रिकॉर्डिंग के लिए काम कर रहा है मिला है। समाधान के काम को दिखाने के लिए बनाए गए एक साधारण एंड्रॉइड प्रोजेक्ट में link यहां दिया गया है। इसके अलावा, मैंने ऐप को चित्रित करने के लिए प्रोजेक्ट के अंदर कुछ प्रिंट स्क्रीन डालीं।

मैं संक्षेप में दृष्टिकोण मैं इस्तेमाल किया समझाने की कोशिश कर रहा हूँ। मैंने उस परियोजना में दो विशेषताओं को जोड़ा: Google स्पीच एपीआई और फ्लैक रिकॉर्डिंग।

Google स्पीच एपीआई HTTP कनेक्शन के माध्यम से बुलाया जाता है। ।

"(...) नई [गूगल] एपीआई एक पूर्ण द्वैध स्ट्रीमिंग एपीआई है इसका मतलब क्या है, यह है कि यह वास्तव में दो HTTP connections- एक पोस्ट करने के लिए अनुरोध का उपयोग करता है: Mike Pultz एपीआई के बारे में अधिक विवरण देता है सामग्री को "लाइव" खंडित स्ट्रीम के रूप में अपलोड करें, और परिणाम तक पहुंचने के लिए दूसरा जीईटी अनुरोध, जो लंबे ऑडियो नमूने के लिए अधिक समझ में आता है, या ऑडियो स्ट्रीमिंग के लिए।। Flac रिकॉर्डिंग

मैं निकालने और कुछ टुकड़े अनुकूल के माध्यम से है कि परियोजना में Flac रिकॉर्डिंग लागू किया: "

हालांकि, इस एपीआई ठीक से काम करने के लिए एक FLAC ध्वनि फ़ाइल प्राप्त करना चाहते हैं यही कारण है कि हमें दूसरे भाग में जाने के लिए बनाता है ऑडियोबू नामक ओपन सोर्स ऐप से कोड और पुस्तकालयों का। ऑडियोबू फ्लैक प्रारूप को रिकॉर्ड और प्ले करने के लिए देशी कोड का उपयोग करता है।

इस प्रकार, एक फ्लैक ध्वनि रिकॉर्ड करना संभव है, इसे Google स्पीच एपीआई को भेजें, टेक्स्ट प्राप्त करें और खेलें ध्वनि जो अभी दर्ज की गई थी।

प्रोजेक्ट मैंने इसे बनाने के लिए बुनियादी सिद्धांत बनाए हैं और विशिष्ट स्थितियों के लिए बेहतर किया जा सकता है। इसे एक अलग परिदृश्य में काम करने के लिए, Google स्पीच एपीआई कुंजी प्राप्त करना आवश्यक है, जिसे Google क्रोमियम-देव समूह का हिस्सा बनकर प्राप्त किया जाता है। मैंने उस प्रोजेक्ट में सिर्फ एक काम छोड़ने के लिए एक कुंजी छोड़ी, लेकिन मैं इसे अंततः हटा दूंगा। अगर किसी को इसके बारे में अधिक जानकारी चाहिए, तो मुझे बताएं क्योंकि मैं इस पोस्ट में 2 से अधिक लिंक नहीं डाल पा रहा हूं।

+0

मैं जल्द ही आपके समाधान का परीक्षण करने जा रहा हूं। मेरे पास लंबे समय तक उचित उपकरण नहीं है। आखिर में मेरे पास इसका परीक्षण करने के लिए डिवाइस है। – woyaru

+0

@isantsan क्या आप मुझे बता सकते हैं कि मेमोरी कार्ड में ऑडियो फ़ाइल को सहेजने के लिए यह कितना सकारात्मक है और फिर उसे ऑडियो को भाषण में टेक्स्ट एपीआई में परिवर्तित करें? मैं वही फीचर्स करना चाहता हूं। क्या आप मुझे इसके लिए नमूना कोड बताएं ताकि मैं शुरू कर सकूं। – Google

+0

हम ऑडियो को .flac फ़ाइल के रूप में रिकॉर्ड करते हैं (ऑडियोबु द्वारा विकसित कुछ पुस्तकालयों का उपयोग करके), और फिर HTTP कनेक्शन के माध्यम से .flac फ़ाइल को Google को भेजें। गिटहब प्रोजेक्ट के मेरे उत्तर में एक लिंक है जिसमें इस कार्यान्वयन का एक सरल उदाहरण है। – lsantsan

1

मैंने सफलतापूर्वक इसे CLOUD SPEECH API की सहायता से पूरा किया है। आप इसे google speech द्वारा डेमो पा सकते हैं।

एपीआई आपके वैश्विक उपयोगकर्ता आधार का समर्थन करने के लिए 80 से अधिक भाषाओं और संस्करणों को मान्यता देता है। आप एप्लिकेशन के माइक्रोफ़ोन को निर्देशित करने वाले उपयोगकर्ताओं के पाठ को प्रतिलिपि बना सकते हैं, ध्वनि के माध्यम से कमांड-एंड-कंट्रोल सक्षम कर सकते हैं, या कई अन्य उपयोग मामलों के बीच ऑडियो फ़ाइलों को ट्रांसक्रिप्ट कर सकते हैं। अनुरोध में अपलोड किए गए ऑडियो को पहचानें, और Google क्लाउड स्टोरेज पर अपने ऑडियो स्टोरेज के साथ एकीकृत करें, उसी तकनीक का उपयोग करके Google पर अपने उत्पादों को पावर करता है।

यह Google स्पीच एपीआई की सहायता से डेटा ट्रांसक्रिप्ट करने के लिए ऑडियो बफर का उपयोग करता है। मैंने AudioRecorder की सहायता से ऑडियो रिकॉर्डिंग को स्टोर करने के लिए इस बफर का उपयोग किया है।

तो इस डेमो के साथ हम ऑडियो रिकॉर्डिंग के साथ समान रूप से उपयोगकर्ता के भाषण को ट्रांसक्रिप्ट कर सकते हैं।

इसमें, यह आवाज के आधार पर भाषण मान्यता शुरू करता है और रोकता है। यह VoiceRecorder.java में SPEECH_TIMEOUT_MILLIS की सुविधा भी प्रदान करता है जो RecognizerIntent के EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS के समान है, लेकिन उपयोगकर्ता नियंत्रित है।

तो सब कुछ, आप चुप्पी टाइमआउट निर्दिष्ट कर सकते हैं और इसके आधार पर यह उपयोगकर्ता आउटपुट के बाद रुक जाएगा और जैसे ही उपयोगकर्ता बोलना शुरू कर देगा।

0

''पर और android-opus' (ओपसलिब) पर हालिया परियोजनाएं एंड्रॉइड एक्सटी में एक ऑपस फ़ाइल में ऑडियो रिकॉर्ड के साथ सरल, समवर्ती मान्यता की अनुमति देती हैं। भंडारण।

माइक्रोफोन बफर पढ़ने के बाद कोड के केवल कुछ अतिरिक्त लाइनों के साथ, भाषण परियोजना में VoiceRecorder को देखते हुए, बफर भी वर्तमान speech- के अलावा एक fileSink (ओपस-कोडेक के PCM16) द्वारा उपयोग किया जा देखने वाला।

Google-speech-opus-recorder

संबंधित मुद्दे