录制视频时启用语音识别

时间:2019-07-24 13:19:30

标签: android kotlin speech-recognition

我正在尝试使用语音识别技术来实现录像机。 能够打开相机并使用语音识别开始录制,但是当视频录制开始时,我的语音识别会停止并且无法传递任何命令来停止录制。有什么办法可以通过语音命令停止录音。或者可以在录像机运行时运行语音识别器。告诉我是否有图书馆。预先感谢。

class MainActivity : AppCompatActivity(), VoiceManagerImpl.VoiceManagerListener {

private val ALL = arrayOf(
    Manifest.permission.CAMERA,
    Manifest.permission.WRITE_EXTERNAL_STORAGE,
    Manifest.permission.RECORD_AUDIO)

private val START = 100
private var voiceManager : VoiceManagerImpl? = null

private var myCamera: Camera? = null
private var myCameraSurfaceView: MyCameraSurfaceView? = null
private var mediaRecorder: MediaRecorder? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    if (hasPermissions(ALL)) {

        voiceManager = VoiceManagerImpl(this)
        voiceManager?.setVoiceManagerListener(this)
        voiceManager?.listen(START)

    } else {
        ActivityCompat.requestPermissions(this, ALL, 101)
    }
}

private fun hasPermissions(permissions: Array<String>): Boolean {
    for (permission in permissions) {
        if (ActivityCompat.checkSelfPermission(this, permission) !=
            PackageManager.PERMISSION_GRANTED) {
            return false
        }
    }
    return true
}

override fun onResults(results: ArrayList<String>?, type: Int) {
    Log.i("TAG", "Data : " + results?.get(0))

    if (results?.get(0) == "open") {
        openCamera()
        voiceManager?.listen(START)
    } else if (results?.get(0) == "start") {
        startCamera()
        voiceManager?.listen(START)
    } else if (results?.get(0) == "stop") {
        mediaRecorder?.stop()  // stop the recording
        releaseMediaRecorder() // release the MediaRecorder object

        finish()
    } else {
        voiceManager?.listen(START)
    }
}

private fun startCamera() {
    releaseCamera()

    if (!prepareMediaRecorder()) {
        Toast.makeText(
            this@MainActivity,
            "Fail in prepareMediaRecorder()!\n - Ended -",
            Toast.LENGTH_LONG
        ).show()
        finish()
    }

    mediaRecorder?.start()
}

override fun onSpeechCompleted(requestCode: Int) {

}

private fun openCamera() {
    myCamera = getCameraInstance()
    if (myCamera == null) {
        Toast.makeText(
            this@MainActivity,
            "Fail to get Camera",
            Toast.LENGTH_LONG
        ).show()
    } else {
        myCameraSurfaceView = MyCameraSurfaceView(this, myCamera!!)
        val myCameraPreview = findViewById<FrameLayout>(R.id.videoview)
        myCameraPreview.addView(myCameraSurfaceView)
    }
}

private fun releaseCamera() {
    if (myCamera != null) {
        myCamera?.release()        // release the camera for other applications
        myCamera = null
    }
}

private fun prepareMediaRecorder(): Boolean {
    myCamera = getCameraInstance()
    mediaRecorder = MediaRecorder()

    myCamera?.unlock()
    mediaRecorder?.setCamera(myCamera)

    mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.CAMCORDER)
    mediaRecorder?.setVideoSource(MediaRecorder.VideoSource.CAMERA)

    mediaRecorder?.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_480P))

    mediaRecorder?.setOutputFile("/sdcard/myvideo.mp4")
    mediaRecorder?.setMaxDuration(60000) // Set max duration 60 sec.
    mediaRecorder?.setMaxFileSize(5000000) // Set max file size 5M

    val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
    audioManager.mode = AudioManager.MODE_NORMAL
    audioManager.isMicrophoneMute = false

    mediaRecorder?.setPreviewDisplay(myCameraSurfaceView?.holder?.surface)

    try {
        mediaRecorder?.prepare()
    } catch (e: IllegalStateException) {
        releaseMediaRecorder()
        return false
    } catch (e: IOException) {
        releaseMediaRecorder()
        return false
    }

    return true
}

private fun releaseMediaRecorder() {
    if (mediaRecorder != null) {
        mediaRecorder?.reset()   // clear recorder configuration
        mediaRecorder?.release() // release the recorder object
        mediaRecorder = null
        myCamera?.lock()           // lock camera for later use
    }
}

private fun getCameraInstance(): Camera? {
    // TODO Auto-generated method stub
    var c: Camera? = null
    try {
        c = Camera.open() // attempt to get a Camera instance
    } catch (e: Exception) {
        Log.i("TAG", "Err : " , e)
    }

    return c // returns null if camera is unavailable
}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)

    if (requestCode == 101 && hasPermissions(ALL)) {

        voiceManager = VoiceManagerImpl(this)
        voiceManager?.setVoiceManagerListener(this)
        voiceManager?.listen(START)

    } else {
        finish()
    }
}

inner class MyCameraSurfaceView(context: Context, private val mCamera: Camera) : SurfaceView(context),
    SurfaceHolder.Callback {

    private val mHolder: SurfaceHolder = holder

    init {
        mHolder.addCallback(this)
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS)
    }

    override fun surfaceChanged(
        holder: SurfaceHolder, format: Int, weight: Int,
        height: Int
    ) {
        if (mHolder.surface == null) {
            return
        }

        try {
            mCamera.stopPreview()
        } catch (e: Exception) { }

        try {
            mCamera.setPreviewDisplay(mHolder)
            mCamera.startPreview()

        } catch (e: Exception) {
        }
    }

    override fun surfaceCreated(holder: SurfaceHolder) {
        try {
            mCamera.setPreviewDisplay(holder)
            mCamera.startPreview()
        } catch (e: IOException) {
        }

    }

    override fun surfaceDestroyed(holder: SurfaceHolder) {}
}

VoiceManagerImpl.java

VoiceManager.java

0 个答案:

没有答案