Professor Schwartzman's Acme Canine Decoder 2000 Introduction
We -- especially the geeks among us, who tend to be fans -- all remember this old Far Side cartoon:

Clearly, Professor Schwartzman could have brushed up on his programming skills just a wee bit more before he put his invention to use. But can you replicate it yourself... using as few bytes as possible?
Input Specs
You must create a script that translates dog sounds into appropriately intonated &quot;Hey&quot;s. This is pure code golf; the lowest number of bytes wins.
Your input will consist of some combination of the following tokens:

Bark, Baark, Baaark, Baaaark, ... (that is, B*rk  with at least 1 a replacing the asterisk)
Woof, Wooof, Woooof, ... (W*f with at least 2 os replacing the asterisk)
Grr, Grrr, Grrrr, ..., (G followed by at least 2 rs)
Any number of . (period), ! (exclamation mark) and/or ? (question mark) characters, which may occur anywhere in the input

Note, again, that the Woof-based and Grr-based tokens always require at least two os and rs respectively; Wof and Gr are not valid tokens.
There is no limit on how long a token can be (e.g., how many repeated as there can be in a Bark token); however, your decoder only needs to work correctly for input tokens with up to 10 total as, os, or rs to pass this challenge.
Output Specs
Faithful to Schwartzman's design, your canine decoder program must process it into output text as follows:

Bark, Woof, and Grr become Hey;
Baark, Wooof, and Grrr become Heyy;
Baaark, Woooof, and Grrrr become Heyyy; etc.
For all Bark-based tokens, the number of ys in the output Hey-based token must be equal to the number of as;
For all Woof-based tokens, the number of ys in the output Hey-based token must be one less than the number of os;
For all Grr-based tokens, the number of ys in the output Hey-based token must be one less than the number of rs;
All punctuation (., !, and ?) is left unchanged.

Remember to drop one y from the output for Woofs and Grrs only! The input Baaaaaaaark?, with 8 as, will become Heyyyyyyyy?, with a matching set of 8 ys. However, Woooooooof? becomes only Heyyyyyyy?, with 7 ys.
Again, if you can get your program to work for input tokens of unlimited size, that's great, but for purposes of this challenge, your program will only be checked to ensure that it works properly for input tokens that have no more than 10 repeated letters.
All Bark-, Woof-, and Grr-based tokens in your input are assumed to begin with capital letters. Therefore, there is no need to handle turning Bark grrr into Hey heyy or anything similar.
Example Inputs and Outputs



Input: Bark. Bark! Bark!!
Output: Hey. Hey! Hey!!




Input: Baaaaaark? (six as)
Output: Heyyyyyy? (six ys)




Input: Grrrrrrrr... (eight rs)
Output: Heyyyyyyy... (seven ys)




Input: ?...!
Output: ?...!




Input: Wooof Woof? Grrrr. Baaaark Grr!
Output: Heyy Hey? Heyyy. Heyyyy Hey!
Retina, 24 18 17 16 bytes

1 byte saved based on an idea in MT0's answer.

\wf?k?
y
\byy
He


Try it online!

Explanation

\wf?k?
y


This simply turns all letters into y, but if they are followed by an f or k we immediately replace that as well. By removing f and k we "normalise" the lengths of the words so that they now all have two more ys than they need.

\byy
He


This turns the first two y of every word into He, completing the transformation.