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