Что такое «Unhashable type»?
Объекты в Python бывают изменяемые, mutable, и неизменяемые, unmutable.
Первые динамически работают с памятью, и их адрес может менятся, под вторые выделяется конкретный объем памяти и их адрес постоянен. Соответственно поэтому ключём или индексом может быть только второй тип обьектов, это кортежи, множества, строки, числа и отображения, такие объекты - hashable.
В вашем случае keys_to_delete должен был быть кортежем.
audio = (
    {'lyrics_id': 3586866, 'title': 'Fruhling in Paris', 'id': 358450897, 'artist': 'Rammstein', 'owner_id': 358450897},
    {'lyrics_id': 3655472, 'title': 'Zwitter', 'id': 358450894, 'artist': 'Rammstein', 'owner_id': 358450897},
)

keys_to_delete = {'owner_id', 'duration', 'url', 'lyrics_id', 'album_id', 'genre_id'}

for track in audio:
    for attribute in keys_to_delete:
        try:
            del track[attribute]
        except KeyError:
            pass
Комментарии:
1) Блок try..except используется для того, чтобы не проверять наличие ключа в словаре дважды (при явной проверке и во время del). Поскольку, вероятно, в большинстве случаев искомые ключи присутствуют, это будет самым быстрым способом.
2) Про проверку "key in dictionary уже сказал Pavel Denisov.