首页 > 解决方案 > 如何增加语音识别(Speech to Text)android(SpeechRecognizer)的收听时间

问题描述

我正在开发需要语音转文本的应用程序。我已经集成了 SpeechRecognizer服务。请检查下面的演示项目代码是否相同。在这里,我测试了SpeechRecognizer会在 10 到 15 秒后自动停止收听。所以我寻找以下解决方案来增加收听时间,但没有奏效。

解决方案 1:SpeechRecognizer - 时间限制

解决方案2:我设置了以下参数但没有奏效。

解决方案 3:我还将 Mozilla 语音集成到文本中,但它不像谷歌那样准确。

请帮助我,我被困在这里。无法再继续了。

class MainActivity : AppCompatActivity() {

    lateinit var speechRecognize: SpeechRecognizer
    var editText: EditText? = null
    var micButton: ImageView? = null
    var speechRecognizerIntent: Intent? = null
    var audioManager: AudioManager? = null
    var textRecorded = ""
    var isActive = true

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        speechRecognize = SpeechRecognizer.createSpeechRecognizer(this)
        audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager?

        muteRecognition(true)
        editText = findViewById(R.id.text);
        micButton = findViewById(R.id.button);
        micButton?.setOnClickListener {
            if (it.tag == null) {
                isActive = true
                launchSpeechIntent()
                speechRecognize.startListening(speechRecognizerIntent)
                it.tag = 1
            } else if (it.tag == 1) {
                isActive = false
                parseText()
                speechRecognize.stopListening()
                speechRecognize.destroy()
                it.tag = null
            }
        }
        val permissions = ArrayList<String>()

        if (ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.RECORD_AUDIO
            )
            != PackageManager.PERMISSION_GRANTED
        ) {
            permissions.add(Manifest.permission.RECORD_AUDIO)
        }
        if (ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
            )
            != PackageManager.PERMISSION_GRANTED
        ) {
            permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
        }
        if (permissions.isNotEmpty()) {
            ActivityCompat.requestPermissions(
                this,
                permissions.toArray(arrayOf<String>()),
                10
            )
        } else
            launchSpeechIntent()


        //else
        //  startRequest()
    }


    @Suppress("DEPRECATION")
    private fun muteRecognition(mute: Boolean) {
        audioManager?.let {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val flag = if (mute) AudioManager.ADJUST_MUTE else AudioManager.ADJUST_UNMUTE
                it.adjustStreamVolume(AudioManager.STREAM_NOTIFICATION, flag, 0)
                it.adjustStreamVolume(AudioManager.STREAM_ALARM, flag, 0)
                it.adjustStreamVolume(AudioManager.STREAM_MUSIC, flag, 0)
                it.adjustStreamVolume(AudioManager.STREAM_RING, flag, 0)
                it.adjustStreamVolume(AudioManager.STREAM_SYSTEM, flag, 0)
            } else {
                it.setStreamMute(AudioManager.STREAM_NOTIFICATION, mute)
                it.setStreamMute(AudioManager.STREAM_ALARM, mute)
                it.setStreamMute(AudioManager.STREAM_MUSIC, mute)
                it.setStreamMute(AudioManager.STREAM_RING, mute)
                it.setStreamMute(AudioManager.STREAM_SYSTEM, mute)
            }
        }
    }

    fun launchSpeechIntent() {
        speechRecognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        speechRecognizerIntent?.putExtra(
            RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
        );
        speechRecognizerIntent?.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.packageName)
        speechRecognizerIntent?.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
        speechRecognizerIntent?.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1)
        speechRecognizerIntent?.putExtra(
            RecognizerIntent.EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS,
            30000
        )
        speechRecognize.setRecognitionListener(object : RecognitionListener {
            override fun onReadyForSpeech(params: Bundle?) {
                Log.e("ready for speeach", "true")
            }

            override fun onRmsChanged(rmsdB: Float) {
                Log.e("RMS changed", rmsdB.toString())

            }

            override fun onBufferReceived(buffer: ByteArray?) {
                Log.e("buffer", buffer.toString())
            }

            override fun onPartialResults(partialResults: Bundle?) {
                Log.e("ready for speeach", "true" + partialResults.toString())

            }

            override fun onEvent(eventType: Int, params: Bundle?) {
                Log.e("event", eventType.toString())
                Log.e("params", params.toString())
            }

            override fun onBeginningOfSpeech() {
                editText!!.setHint("Listening...........")
                editText!!.setText("")
            }

            override fun onEndOfSpeech() {
            }

            override fun onError(error: Int) {
                Log.e("Error", error.toString())
                speechRecognize.startListening(speechRecognizerIntent)
                //editText?.setText("Error:"+error.toString())
            }

            override fun onResults(results: Bundle?) {
                val data: ArrayList<String>? =
                    results!!.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
                var flot = results!!.getFloatArray(SpeechRecognizer.CONFIDENCE_SCORES)
                textRecorded += "#${data!!.first()}"
                //     restart()
            }
        })
    }

    fun restart() {
        if (isActive) {
            speechRecognize.destroy()
            launchSpeechIntent()
            speechRecognize.startListening(speechRecognizerIntent)
        } else {
            speechRecognize.stopListening()
            speechRecognize.destroy()
        }
    }

    override fun onResume() {
        super.onResume()

    }

    fun parseText() {
        try {
            editText?.setText(textRecorded)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    private fun checkPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.RECORD_AUDIO),
                10
            )
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            10 ->
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                    launchSpeechIntent()
                }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        speechRecognize.stopListening()
        speechRecognize.destroy()
    }


}

标签: androidspeech-recognition

解决方案


推荐阅读