Android 蓝牙耳机 语音输入与播放

Android 蓝牙耳机 语音输入与播放

原以为手机连上蓝牙耳机就能录入语音信号,too young to simple.

经过一番搜寻与折腾,找到两种方式:

  • AudioManager.startBluetoothSco(true)
  • BluetoothHeadset.startVoiceRecognition(BluetoothDevice device)

第一种方式是通过sco,这种方式有个缺点:连接上和释放时会有的一声

第二种方式则没这个缺点

SCO

设置蓝牙权限AndroidManifest.xml

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.BLUETOOTH" />
private AudioManager mAudioManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
  mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
  //启动蓝牙输入
	btStart();
}

//启动蓝牙输入
private void btStart() {
  if (mAudioManager != null) {
    mAudioManager.setBluetoothScoOn(true);
    mAudioManager.startBluetoothSco();
  }
}

//停止蓝牙输入--如果不停止,播放语音的时候没声音
private void btStop() {
  if (mAudioManager != null) {
    mAudioManager.setBluetoothScoOn(false);
    mAudioManager.stopBluetoothSco();
  }
}

语音播报用的是百度TTS SDK,如果不调用btStop停止蓝牙sco,会听不到任何声音。

为了能听到声音,在百度TTS 的回调接口SpeechSynthesizerListener的合成开始阶段onSynthesizeStart调用btStop停止sco,当语音播放完成onSpeechFinish之后调用btStart重新获取语音输入通道。(因为我的app是带语音唤醒功能的,所以要一直让蓝牙耳机采集到输入信号)

package com.twx.poc.voiceprint.baidu.tts;

import android.media.AudioManager;
import android.util.Log;

import com.baidu.tts.client.SpeechError;
import com.baidu.tts.client.SpeechSynthesizerListener;
import com.twx.poc.voiceprint.util.bluetooth.MyBluetooth;

public class SpeechListener implements SpeechSynthesizerListener {
    private static final String TAG = "SpeechListener";

    private AudioManager mAudioManager;

    public SpeechListener(AudioManager mAudioManager) {
        this.mAudioManager = mAudioManager;
    }

    @Override
    public void onSynthesizeStart(String s) {
        Log.i(TAG, "onSynthesizeStart: 开始合成语音...");
        btStop();
    }

    @Override
    public void onSynthesizeDataArrived(String s, byte[] bytes, int i, int i1) {

    }

    @Override
    public void onSynthesizeFinish(String s) {
        Log.i(TAG, "onSynthesizeStart: 合成语音完成...");
    }

    @Override
    public void onSpeechStart(String s) {

    }

    @Override
    public void onSpeechProgressChanged(String s, int i) {

    }

    @Override
    public void onSpeechFinish(String s) {
        Log.i(TAG, "onSpeechFinish: 完成播放");
        btStart();
    }

    @Override
    public void onError(String s, SpeechError speechError) {
        Log.e(TAG, "onError: 语音播放出错了"+speechError.description );
    }


    private void btStart() {
        if (mAudioManager != null) {
            mAudioManager.setBluetoothScoOn(true);
            mAudioManager.startBluetoothSco();
        }
    }

    private void btStop() {
        if (mAudioManager != null) {
            mAudioManager.setBluetoothScoOn(false);
            mAudioManager.stopBluetoothSco();
        }
    }
}

BluetoothHeadset.startVoiceRecognition

这个方案的好处是连接与释放的时候没有嘟声

参考博文:

权限:在soc方案的基础上加一个

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

创建一个MyBluetooth类,该类负责获取已连接的蓝牙设备、启动、停止蓝牙语音输入。

package com.twx.poc.voiceprint.util.bluetooth;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothProfile;
import android.content.Context;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class MyBluetooth {
    private BluetoothHeadset bluetoothHeadset;

    private BluetoothDevice btDevice;

    BluetoothProfile.ServiceListener blueHeadsetListener = new BluetoothProfile.ServiceListener() {
        @Override
        public void onServiceConnected(int profile, BluetoothProfile proxy) {

            if(profile==BluetoothProfile.HEADSET){
                bluetoothHeadset=(BluetoothHeadset) proxy;
            }
            if (bluetoothHeadset != null) {
                List<BluetoothDevice> devices = bluetoothHeadset.getConnectedDevices();
                System.out.println("蓝牙已连接...数量"+devices.size());
                for (int i = 0; i < devices.size(); i++) {
                    System.out.println("名称: "+devices.get(i).getName());
                    btDevice = devices.get(i);
                }
                //这里启动蓝牙语音输入
                start();
            }
        }

        @Override
        public void onServiceDisconnected(int profile) {
            if(profile==BluetoothProfile.HEADSET){
                bluetoothHeadset=null;
            }
        }
    };

    public void initBlueToothHeadset(Context context,Activity activity){
        BluetoothAdapter adapter;
        //android4.3之前直接用BluetoothAdapter.getDefaultAdapter()就能得到BluetoothAdapter
        if(android.os.Build.VERSION.SDK_INT<android.os.Build.VERSION_CODES.JELLY_BEAN_MR2){
            adapter=BluetoothAdapter.getDefaultAdapter();
        }else {
            BluetoothManager bm=(BluetoothManager) activity.getSystemService(Context.BLUETOOTH_SERVICE);
            adapter=bm.getAdapter();
        }
        adapter.getProfileProxy(context, blueHeadsetListener, BluetoothProfile.HEADSET);
    }

    /**
     * 蓝牙开始录入语音...
     */
    public void start() {
        if (btDevice != null) {
            System.out.println(btDevice.getName()+" 蓝牙开始录入语音...");
            bluetoothHeadset.startVoiceRecognition(btDevice);
        }
    }

    /**
     * 蓝牙停止录入语音...
     */
    public void stop() {
        if (btDevice != null) {
            System.out.println(btDevice.getName()+" 蓝牙停止录入语音...");
            bluetoothHeadset.stopVoiceRecognition(btDevice);
        }
    }
}

activity中使用MyBluetooth

@Override
protected void onCreate(Bundle savedInstanceState) {
				MyBluetooth bluetooth = new MyBluetooth();
        //获取已连接的BluetoothDevice并启动蓝牙输入
        bluetooth.initBlueToothHeadset(this,this);
  
  			//百度语音播报回调接口
        SpeechListener speechListener = new SpeechListener(bluetooth);
}

SpeechListener中控制蓝牙耳机的语音输入和释放(为了语音播报能正常进行,必须释放)

public class SpeechListener implements SpeechSynthesizerListener {
    private static final String TAG = "SpeechListener";

    private MyBluetooth bluetooth;

    public SpeechListener(MyBluetooth bluetooth) {
        this.bluetooth = bluetooth;
    }

    @Override
    public void onSynthesizeStart(String s) {
        Log.i(TAG, "onSynthesizeStart: 开始合成语音...");
        btStop();
    }

    @Override
    public void onSynthesizeDataArrived(String s, byte[] bytes, int i, int i1) {

    }

    @Override
    public void onSynthesizeFinish(String s) {
        Log.i(TAG, "onSynthesizeStart: 合成语音完成...");
    }

    @Override
    public void onSpeechStart(String s) {

    }

    @Override
    public void onSpeechProgressChanged(String s, int i) {

    }

    @Override
    public void onSpeechFinish(String s) {
        Log.i(TAG, "onSpeechFinish: 完成播放");
        btStart();
    }

    @Override
    public void onError(String s, SpeechError speechError) {
        Log.e(TAG, "onError: 语音播放出错了"+speechError.description );
    }

    private void btStart() {
        if (bluetooth != null) {
            bluetooth.start();
        }
    }

    private void btStop() {
        if (bluetooth != null) {
            bluetooth.stop();
        }
    }
}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android蓝牙耳机可以用来进行录音,在一些特定的场景下非常方便。首先,要确保安装了适合的录音应用程序,可以通过应用商店下载并安装。接下来,打开蓝牙设置并将蓝牙耳机连接到Android设备上。连接成功后,打开录音应用程序并进入录音界面。在录音界面上,选择蓝牙耳机作为录音输入设备。这个选项通常可以在设置菜单中找到。完成以上步骤后,您可以开始录制声音了。通过按下录音按钮或界面上的相应按钮即可开始录制。在录音过程中,蓝牙耳机将会作为麦克风来捕捉声音。录音应用程序通常提供了一些额外的功能,例如调整录音音量、选择录音格式等。录制完成后,您可以保存录音文件或进行其他后续处理。总的来说,使用蓝牙耳机进行录音是一种方便快捷的方式,尤其适用于需要移动自由度的情况,如户外采访、会议记录等。 ### 回答2: 在 Android 设备上使用蓝牙耳机进行录音是可能的。蓝牙耳机通常有麦克风功能,因此可以用于录制语音或音频。要使用蓝牙耳机进行录音,可以按照以下步骤进行操作: 1. 确保蓝牙耳机已与 Android 设备成功配对。通常,在设备的设置中的“蓝牙”选项卡中可以完成配对过程。 2. 打开设备上的录音应用程序。Android 设备通常都预装了一款录音应用程序,你也可以从 Google Play 商店下载其他应用。 3. 在录音应用程序中,选取蓝牙耳机作为录音设备。通常,可以在应用程序的设置或选项中找到这个选项。 4. 确保蓝牙耳机处于录音模式。有些耳机可能需要通过按下耳机上的按钮来启用录音功能。 5. 开始录音。在应用程序界面上,通常有一个“开始录音”或相似的按钮,点击它以开始录制。 6. 录制完成后,点击“停止录音”按钮来停止录制。你也可以在应用程序中选择保存录音文件的位置和名称。 7. 通过蓝牙耳机或设备本身的音频播放功能,可以回放和听取录音。 需要注意的是,由于 Android 设备和蓝牙耳机的品牌和型号众多,某些步骤可能会因设备不同而有所区别。因此,按照设备和耳机的用户手册中提供的具体说明进行操作会更加可靠和准确。 ### 回答3: Android蓝牙耳机可以用于录音。蓝牙耳机和手机之间可以进行蓝牙连接,手机可以通过蓝牙耳机麦克风录制声音。 首先,确保蓝牙耳机已经成功连接到手机。打开手机的蓝牙设置,将蓝牙耳机的配对模式打开,然后在手机上选择匹配的蓝牙设备并连接。 接着,打开手机上的录音应用程序。在录音应用程序中,选择蓝牙耳机作为录音的音频输入设备。通常可以通过点击“设置”或者“音频输入”来选择录音设备。在设备列表中,选择已连接的蓝牙耳机。 然后,点击录音应用程序中的“开始录制”按钮开始录音。此时,蓝牙耳机麦克风将开始录制声音。可以根据需要进行讲话或者演唱等操作。 录制完成后,点击录音应用程序中的“停止录制”按钮停止录音。录音文件通常会自动保存在手机上的储存空间中。 需要注意的是,不同的录音应用程序可能会有略微不同的操作步骤,具体操作可能会有所变化。但是基本的原理是相同的,即通过蓝牙耳机麦克风来录制声音并保存为文件。 总结一下,Android蓝牙耳机可以通过手机上的录音应用程序进行录音操作。只需连接蓝牙耳机并选择其作为录音设备,然后开始录制声音,最后保存录音文件即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值