Question: I've recently bought BT Sony headset. When I switch it to A2DP profile everything works fine. But when I switch to HSP/HFP for videoconference the sound is so terrible that I cannot understand other participants. Is there anything that can be done about that? It's really annoying I cannot use my headset for conferences when I bought them exactly for that.

Answer: 
I have this problem for 6 months, when I bought my Sennheisers.
It seems the headset profile (HSP/HFP) defines at least 2 codecs, with 8KHz and 16KHz rates. Windows and Android can use 16KHz, whereas linux only uses 8KHz (and I assume a different compression, since lows are also terrible).
Searching on Google, all "low quality" questions seem to be related to listening (i.e.: solved by A2DP switch), not for conferences.

In all those months, I only found a bug report that says ChromeOS works better (and being unable to port those patches to linux distros).

PS: please avoid setting this as an answer. I would prefer one that actually points to 16KHz solution.
I am having the same issue, at this point i have worked around it so that after conference i can at lease switch to a2dp\_sink easily.

```
#!/bin/bash
bluetoothctl connect FC:58:FA:13:75:6F
DEFAULT_SINK=$(pactl list short sinks | grep "pci" | awk '{print $2}')
echo "Muting $DEFAULT_SINK"
pactl set-sink-mute "$DEFAULT_SINK" "1"

if [ $1 == "1" ]; then 
    echo "Card Profile Selected: a2dp_sink"
    card_profile="a2dp_sink"
else  
    echo "Card Profile Selected: headset_head_unit"
    card_profile="headset_head_unit"
fi     

pactl set-card-profile bluez_card.FC_58_FA_13_75_6F $card_profile

sink=$(pactl list short sinks | grep -i 'bluez_sink' | cut -c1-2)

if [ -z $sink ]; then
    echo "Usage: $0 <sinkId/sinkName>" >&2
    echo "Valid sinks:" >&2
    pactl list short sinks >&2
    exit 1
fi

newSink="$sink"
echo $newSink

pactl list short sink-inputs|while read stream; do
    streamId=$(echo $stream|cut '-d ' -f1)
    echo "moving stream $streamId"
    pactl move-sink-input $streamId $newSink
done

echo "Unmuting $DEFAULT_SINK"
pactl set-sink-mute "$DEFAULT_SINK" "0"

```