# Julia, <s>165</s> <s>155</s> 151 bytes

<!-- language-all: lang-default -->

    s->(x=split(s,r"\W",keep=1<0);d=[];for i=1:(L=endof(x)),j=i+1:L lcfirst(x[i])[1]==lcfirst(x[j])[1]&&(d=[d;j])end;deleteat!(x,sort(∪(d)));join(x," "))

This is an anonymous function that accepts a string and returns a string. To call it, assign it to a variable.

Ungolfed:

    function f(s)
        # Split on unwanted characters, omitting them from the array
        x = split(s, r"\W", keep=false)

        # Initialize an array to hold the indices of words to remove
        d = []

        # Locate all indices for removal by checking the first letter
        # of each word against the first letters of the remaining words
        for i = 1:(L=endof(x)), j = i+1:L
            lcfirst(x[i])[1] == lcfirst(x[j])[1] && (d = [d; j])
        end

        # Remove words from the array by index
        deleteat!(x, sort(∪(d)))

        # Join the array back into a string, separated by spaces
        return join(x, " ")
    end

Saved 3 bytes thanks to Sp3000!