【问题标题】:How to mute SpeechRecognizer's beep sound without muting music from MediaPlayer如何在不使 MediaPlayer 中的音乐静音的情况下使 SpeechRecognizer 的哔声静音
【发布时间】:2017-07-24 01:42:41
【问题描述】:

是否可以在不使 MediaPlayer 播放的音乐静音的情况下使 SpeechRecognizer 的哔声静音?

这里代码:

speech = SpeechRecognizer.createSpeechRecognizer(this);
speech.setRecognitionListener(this);
recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, "en");
recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.getPackageName());
recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
recognizerIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);

timer =  new Timer();
timer.schedule(new UpdateTimeTask(),500,2000);

MediaPlayer mp = new MediaPlayer(); 
AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.breathe);
mp.reset();
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
AudioManager myAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
myAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 0, 0);
try {
    mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
    mp.prepare();
}
catch (IOException e) {
    e.printStackTrace();
}

mp.start();


class UpdateTimeTask extends TimerTask {
public void run() {

    mActivity.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            speech.stopListening();
            speech.startListening(recognizerIntent);
        }
    });
}

音频对焦无法解决问题,正在播放音乐,我能听到哔哔声

我不能将STREAM_MUSIC(或整个STREAM_SYSTEM)静音,因为我将它用于MediaPlayer

静音STREAM_ALARM 不适用于SpeechRecognizer

那么如何在 MediaPlayer 播放音乐时将哔声静音

更新

boolean gotFocus = requestAudioFocusForMyApp(MainActivity.this);
        if (gotFocus) {
            MediaPlayer mp = new MediaPlayer();
            AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.breathe);
            mp.reset();
            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
            AudioManager myAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
            myAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 0, 0);
            try {
                mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
                mp.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mp.start();
        }

反多反码反多反码反多反码反多反码反多反码反多反码反多反码反多反码反多反码反多反码反多反码反多反码反多反码p>

【问题讨论】:

  • 您是在询问“是”和“否”的答案,还是在询问如何做?如果您询问如何做,您应该在帖子中包含您的代码。
  • 阅读本文。它说,您一次只能将音频焦点集中在一个源上。 developer.android.com/reference/android/media/…
  • @UmarZaii 添加
  • @user924,我从来没有拒绝过。这是常见的问题之一。您必须将音乐与播放音乐的活动绑定。看我的回答。

标签: android speech-recognition


【解决方案1】:

我更新了我的答案。这应该有效。检查一下!

boolean gotFocus = requestAudioFocusForMyApp(this); /* bind with your context. */
/* You should pass your context of your service, because you are playing music via service. this parameter represents the context of your service */
                if(gotFocus) {
                   MediaPlayer mp = new MediaPlayer();
        AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.breathe);
        mp.reset();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
        AudioManager myAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        myAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, 0, 0);
        try {
            mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
            mp.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mp.start();
                }


private boolean requestAudioFocusForMyApp(final Context context) {
        AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);

        // Request audio focus for playback
        int result = am.requestAudioFocus(null,
                // Use the music stream.
                AudioManager.STREAM_MUSIC,
                // Request permanent focus.
                AudioManager.AUDIOFOCUS_GAIN);

        if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
            Log.d("AudioFocus", "Audio focus received");
            return true;
        } else {
            Log.d("AudioFocus", "Audio focus NOT received");
            return false;
        }
    }

https://developer.android.com/reference/android/media/AudioFocusRequest.html

【讨论】:

  • 是的,我已经在我的其他项目中使用了它,(我在服务中使用 MediaPlayer 播放音乐,并在播放前请求音频焦点)int result = mAudioManager.requestAudioFocus(afChangeListener,stream. AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { 所以如果我添加 SpeechRecognizer 将不会播放哔声那个项目?
  • @user924,你的理解正好相反。您必须将您的活动(从您播放音乐的位置)与 AudioFocus 绑定。您不需要关心任何其他音频源,如 GoogleMaps、语音识别器、警报等。
  • 我正在播放服务类的音乐,所以我在播放音乐之前请求音频焦点developer.android.com/guide/topics/media-apps/audio-app/…
  • @user924,请理解 AudioManager 有权从您的系统中将您的音频静音/取消静音。 AudioManager 适用于您的每个应用程序。当您对特定的音乐播放班级进行 AudioFocus 时,系统仅播放您的班级声音,同时将世界其他地方静音。因为,焦点只针对一个来源。
  • 是的,我明白这一点,当我收到AUDIOFOCUS_LOSS 时,我也有afChangeListener 来暂停我的播放器
猜你喜欢
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2014-10-25
相关资源
最近更新 更多