অ্যান্ড্রয়েড রিকগনিশনলাইস্টেনার: অনার্সল্ট দুটি বার কল করা হচ্ছে


10

আমার কোটলিনে রিকগনিশনলিস্টেনার ব্যবহার করে একটি প্রকল্প রয়েছে। স্পিচ-টেক্সট ফাংশনটি সর্বদা সাফল্য ছিল এবং কখনও কোনও সমস্যা উপস্থাপন করেছিল।

গত সপ্তাহ থেকে এটির রিসাল্ট ফাংশনটি দু'বার কল করা শুরু হয়েছিল। প্রকল্পে কোনও পরিবর্তন করা হয়নি। আমি প্রকল্পের পুরানো সংস্করণগুলি পরীক্ষা করেছি (কয়েক মাস আগে থেকে) এবং তাদেরও একই সমস্যা ছিল।

তিনটি পৃথক মামলা রয়েছে:

  1. ছোট পাঠ্য (1 থেকে 8 শব্দ) এবং স্পিচআরসিগনাইজার স্বয়ংক্রিয়ভাবে বন্ধ হচ্ছে -> অনারসাল্ট () দুটিবার বলা হয়;
  2. বড় পাঠ্য (9 টি শব্দ বা তার বেশি) এবং স্পিচআরসিগনাইজার স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাচ্ছে -> সাধারণ আচরণ (অনারসাল্ট () একবার বলা হয়);
  3. যেকোন পাঠ্য আকার এবং স্পিচরেকগনাইজার স্টপলাইস্টেনিং () ফাংশনটি ম্যানুয়ালি বলা হয় (কোড থেকে) -> সাধারণ আচরণ।

এখানে ভয়েস-রিকগনিশন স্পিচ টু-টেক্সট ক্লাস কোড:

class VoiceRecognition(private val activity: Activity, language: String = "pt_BR") : RecognitionListener {

    private val AudioLogTag = "AudioInput"

    var voiceRecognitionIntentHandler: VoiceRecognitionIntentHandler? = null
    var voiceRecognitionOnResultListener: VoiceRecognitionOnResultListener? = null //Must have this
    var voiceRecognitionLayoutChanger: VoiceRecognitionLayoutChanger? = null

    var isListening = false

    private val intent: Intent
    private var speech: SpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(activity)

    init {
        speech.setRecognitionListener(this)

        intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
        intent.putExtra(
            RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
        )
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, language)
    }

    //It is important to put this function inside a clickListener
    fun listen(): Boolean {
        if (ContextCompat.checkSelfPermission(activity, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.RECORD_AUDIO), 1)
            return false
        }

        speech.startListening(intent)

        Log.i(AudioLogTag, "startListening")

        return true
    }

    //Use this if you want to stop listening but still get recognition results
    fun endListening(){
        Log.i(AudioLogTag, "stopListening")

        speech.stopListening()
        isListening = false
    }

    fun cancelListening(){
        Log.i(AudioLogTag, "cancelListening")

        speech.cancel()
        voiceRecognitionLayoutChanger?.endListeningChangeLayout()
        isListening = false
    }

    override fun onReadyForSpeech(p0: Bundle?) {
        Log.i(AudioLogTag, "onReadyForSpeech")

        voiceRecognitionLayoutChanger?.startListeningChangeLayout()
        isListening = true
    }

    override fun onRmsChanged(p0: Float) {
//        Log.i(AudioLogTag, "onRmsChanged: $p0")
//        progressBar.setProgress((Int) p0)
    }

    override fun onBufferReceived(p0: ByteArray?) {
        Log.i(AudioLogTag, "onBufferReceived: $p0")
    }

    override fun onPartialResults(p0: Bundle?) {
        Log.i(AudioLogTag, "onPartialResults")
    }

    override fun onEvent(p0: Int, p1: Bundle?) {
        Log.i(AudioLogTag, "onEvent")
    }

    override fun onBeginningOfSpeech() {
        Log.i(AudioLogTag, "onBeginningOfSpeech")
    }

    override fun onEndOfSpeech() {
        Log.i(AudioLogTag, "onEndOfSpeech")

        voiceRecognitionLayoutChanger?.endListeningChangeLayout()
        isListening = false
    }

    override fun onError(p0: Int) {
        speech.cancel()
        val errorMessage = getErrorText(p0)
        Log.d(AudioLogTag, "FAILED: $errorMessage")
        voiceRecognitionLayoutChanger?.endListeningChangeLayout()
        isListening = false
    }

    override fun onResults(p0: Bundle?) {

        val results: ArrayList<String> = p0?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION) as ArrayList<String>

        Log.i(AudioLogTag, "onResults -> ${results.size}")

        val voiceIntent: Int? = voiceRecognitionIntentHandler?.getIntent(results[0])
        if (voiceIntent != null && voiceIntent != 0) {
            voiceRecognitionIntentHandler?.handle(voiceIntent)
            return
        }

        voiceRecognitionOnResultListener!!.onResult(results[0])
    }

    private fun getErrorText(errorCode: Int): String {
        val message: String
        when (errorCode) {
            SpeechRecognizer.ERROR_AUDIO -> message = "Audio recording error"
            SpeechRecognizer.ERROR_CLIENT -> message = "Client side error"
            SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS -> message = "Insufficient permissions"
            SpeechRecognizer.ERROR_NETWORK -> message = "Network error"
            SpeechRecognizer.ERROR_NETWORK_TIMEOUT -> message = "Network timeout"
            SpeechRecognizer.ERROR_NO_MATCH -> message = "No match"
            SpeechRecognizer.ERROR_RECOGNIZER_BUSY -> message = "RecognitionService busy"
            SpeechRecognizer.ERROR_SERVER -> message = "Error from server"
            SpeechRecognizer.ERROR_SPEECH_TIMEOUT -> message = "No speech input"
            else -> message = "Didn't understand, please try again."
        }
        return message
    }

    //Use it in your overriden onPause function.
    fun onPause() {
        voiceRecognitionLayoutChanger?.endListeningChangeLayout()
        isListening = false

        speech.cancel()
        Log.i(AudioLogTag, "pause")
    }

    //Use it in your overriden onDestroy function.
    fun onDestroy() {
        speech.destroy()
    }

শুনুন (), শেষলিস্টিং () এবং বাতিললিস্টিং () সবই একটি বোতাম থেকে কল করা হয়।


আমার একই সমস্যা হচ্ছে, সমস্যাটি কেবল স্যামসাং এস 8 এপিআই 9 এর সাথে রয়েছে - স্বীকৃতিটি যখন চলছে তখন আমি আংশিক ফলাফলও দেখতে পাচ্ছি। পুরানো ডিভাইসে আমি এটি অনুভব করি না।
marcinj

আমি এই সমস্যাটি অ্যান্ড্রয়েড and এবং উপরে থেকে দেখেছি ... আমি আমার প্রকল্পটিও পরিবর্তন করি নি .. এটি সবেমাত্র ঘটতে শুরু করে।
পেড্রো হেনরিক ফ্লোরস

"এপিআই 9 সহ সমস্যাটি কেবল স্যামসাং এস 8 এ" - এর মাধ্যমে আমি আমার ডিভাইসগুলিতে আমার পরীক্ষাগুলিতে বোঝাতে চেয়েছিলাম
মার্চিন্জ

1
পোকোফোন এফ 1 তে একই সমস্যা, আমার সমাধানটি ছিল ফলাফলগুলি অভিন্ন কিনা তা পরীক্ষা করে দেখুন, তবে দ্বিতীয় ফলাফলটি যদি তা হয় তা উপেক্ষা করুন
লোটন ২

এটি গতকাল আমার একটি অ্যাপ্লিকেশনে সবেমাত্র শুরু হয়েছিল। কোডটি একবারে কার্যকর করার অনুমতি দেওয়ার জন্য আমি একটি বুলিয়ান যুক্ত করেছি, তবে হঠাৎ কেন এটি করা শুরু হয়েছিল তা সম্পর্কে আমি একটি ব্যাখ্যা পছন্দ করব। কোন আপডেট?
গ্যাভিন রাইট

উত্তর:


2

আমি এই উন্মুক্ত সমস্যাটি পেয়েছি: https://issuetracker.google.com/issues/152628934 89

আমি যেমন মন্তব্য করেছি, আমি ধরে নিয়েছি এটি "স্পিচ স্বীকৃতি পরিষেবা" এর সাথে একটি সমস্যা, অ্যান্ড্রয়েড রিকগনিশনলিস্টনার শ্রেণীর সাথে নয়।


হ্যাঁ, আমিও বিশ্বাস করি এটিই সমস্যা ...
পেড্রো হেনরিক ফ্লোরস

1

এটি গতকাল আমার একটি অ্যাপ্লিকেশনে সবেমাত্র শুরু হয়েছিল। কোডটি একবারে কার্যকর করার অনুমতি দেওয়ার জন্য আমি একটি বুলিয়ান যুক্ত করেছি, তবে হঠাৎ কেন এটি করা শুরু হয়েছিল তা সম্পর্কে আমি একটি ব্যাখ্যা পছন্দ করব। কোন আপডেট?


0

আমারও একই সমস্যা ছিল এবং আমি আমার কোডটিতে সবেমাত্র বুলেটিন পতাকা যুক্ত করেছি, তবে অবশ্যই এটি একটি অস্থায়ী সমাধান এবং আমি এই সমস্যার উত্সটি জানি না।

object : RecognitionListener {

        var singleResult = true

        override fun onResults(results: Bundle?) {
            if (singleResult) {
                results?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION).let {
                    // do something with result
                }
                // next result will be ignored
                singleResult = false
            }
        }
    }

দয়া করে কিছু উদাহরণ কোড যুক্ত করুন।
m02ph3u5
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.