#05AB1E (legacy), 68 65 60 59 bytes
.•5Ç¿ÆΓ•2ô.•1ÒKá ¸ΓìŸÆt`ô_zTºγ„KRI‰ι놽òι•4ô«I¬©¡®ìkh2ôJHçJ
Try it online or verify all test cases.
.•5Ç¿ÆΓ• # Compressed string "bibabobu"
2ô # Split in parts of 2
# → ["bi","ba","bo","bu"]
.•1ÒKá ¸ΓìŸÆt`ô_zTºγ„KRI‰ι놽òι•
# Compressed string "bidibidabidobidubadibadabadobadubodibodabodobodu"
4ô # Split in parts of 4
# → ["bidi","bida","bido","bidu","badi","bada","bado","badu","bodi","boda","bodo","bodu"]
« # Merge both lists together
# → ["bi","ba","bo","bu","bidi","bida","bido","bidu","badi","bada","bado","badu","bodi","boda","bodo","bodu"]
I¬©¡ # Take the input and split on the head (always 'b')
# i.e. "bidibadibidobidabidobodibidobodibidoboduboba"
# → ["idi","adi","ido","ida","ido","odi","ido","odi","ido","odu","o","a"]
®ì # And prepend a 'b' to each item again
# i.e. ["idi","adi","ido","ida","ido","odi","ido","odi","ido","odu","o","a"]
# → ["bidi","badi","bido","bida","bido","bodi","bido","bodi","bido","bodu","bo","ba"]
k # Map each item to the index of the first list
# i.e. ["bidi","badi","bido","bida","bido","bodi","bido","bodi","bido","bodu","bo","ba"]
# → [4,8,6,5,6,12,6,12,6,15,2,1]
h # Convert everything to hexadecimal
# i.e. [4,8,6,5,6,12,6,12,6,15,2,1]
# → ["4","8","6","5","6","C","6","C","6","F","2","1"]
2ôJ # Split it in parts of 2 and join them together
# i.e. ["4","8","6","5","6","C","6","C","6","F","2","1"]
# → ["48","65","6C","6C","6F","21"]
H # Convert that from hexadecimal to an integer
# i.e. ["48","65","6C","6C","6F","21"] → [72,101,108,108,111,33]
ç # And take its ASCII value
# i.e. [72,101,108,108,111,33] → ["H","e","l","l","o","!"]
J # Then join everything together (and output implicitly)
# i.e. ["H","e","l","l","o","!"] → "Hello!"