Cleaning up an utterance using multiple regex substitutions
If you use a regular expression once, you don't get any performance improvement from compiling it. You could just use re.sub directly.
If a string doesn't contain any special characters, there's no point in using a raw literal.
r' ' could be just ' '.
Using the same variable to represent different things is a bad practice. It confuses the people who read your code. It's not a good idea to do things like:

message_ascii = re.compile(r'[^\x00-\x7F]+')
message_ascii = message_ascii.sub(r' ', utterance)


because the same variable holds a compiled regex in the first line and it's reassigned to a string later on.


If you call this function multiple times and want to benefit from pre-compiled regular expressions, you could create a new class that compiles the expressions in its constructor and reuses them:

class TextProcessor:

    def __init__(self):
        # Initializes regular expressions here
        self.ascii_regex = re.compile(...)
        # Other expressions go here

    def process_text(self, text):
        ascii_text = self.ascii_regex.sub(' ', text)
        # The rest of the substitions go here