To preface: "similarity" depends on the listener, as well as on the sound itself. Categorical perception is a powerful force. To a native English speaker aspiration is almost imperceptible, while /s/ and /θ/ are clearly distinct; to a native Hindi speaker, the opposite would be true.
The best way I know of to objectively define phonetic difference is in terms of distinctive features. Every sound can be written as a combination of these features: for instance, /t/ is a "voiceless alveolar plosive", meaning that it lacks the "voice" feature but has "alveolar" and "plosive".
Some features are boolean, such as "rounded" for a vowel. It's there or it isn't. Others have multiple comparable values, such as "place of articulation", where bilabial is closer to labiodental than it is to velar. Still others are generally incomparable, such as "manner of articulation" (is a click more like a fricative or an approximant?).
Unfortunately I don't know of any definitive, established network of phonemes based on these principles. But a distance metric could be established based on your needs.
For example, here's my attempt at a simple distance algorithm, written in Python (representing phonemes as dictionaries).
def featural_distance(a, b):
distance = 0
for key in set().union(a.keys(), b.keys()):
try:
if key in a and key not in b:
distance += int(a[key])
elif key in b and key not in a:
distance += int(b[key])
elif a[key] != b[key]:
distance += abs(int(a[key]) - int(b[key]))
except ValueError: # This will happen if either of the two has a string value. In that case, assume they can't be directly compared.
distance += 1
return distance
def parse_features(s):
d = {}
for word in s.split():
w = word.strip().lower()
d.update(features[w])
return d
And an example feature set:
features = {
'voiced' : {'voice' : 1},
'voiceless' : {'voice' : 0},
'bilabial' : {'place' : 1},
'labiodental' : {'place' : 2},
'dental' : {'place' : 3},
'alveolar' : {'place' : 4},
'retroflex' : {'place' : 5},
'palatoalveolar': {'place' : 6},
'palatal' : {'place' : 7},
'velar' : {'place' : 8},
'uvular' : {'place' : 9},
'pharyngeal' : {'place' : 10},
'glottal' : {'place' : 11},
'plosive' : {'type' : 'p'},
'tap' : {'type' : 't'},
'trill' : {'type' : 'r'},
'nasal' : {'type' : 'n'},
'fricative' : {'type' : 'f'},
'approximant' : {'type' : 'l'},
'vowel' : {'type' : 'a'},
'lateral' : {'lateral' : 1},
'high' : {'height' : 1},
'mid' : {'height' : 2},
'low' : {'height' : 3},
'front' : {'space' : 1},
'center' : {'space' : 2},
'back' : {'space' : 3},
'rounded' : {'round' : 1},
'unrounded' : {'round' : 0},
'aspirated' : {'aspir' : 1},
'unaspirated' : {'aspir' : 0},
'long' : {'length' : 1},
'short' : {'length' : 0},
# Add features here
}
So the distance from "voiced bilabial plosive" to "voiceless bilabial plosive" is 1, to "voiceless bilabial fricative" is 2, and to "voiceless labiodental fricative" is 3.
This certainly has its flaws: /u/ and /w/ are significantly farther apart than they probably should be, for instance, due to vowel and consonant articulation places being stored separately. A better feature set might take that into account and give them a distance of 1 or 2; this is left as an exercise for the reader.