You need to rotate the movement vector by the heading of the character to make the motion local.
You can see an example in this code:
Line 120 to around 130 gathers and rotates the controls to be local to the camera.
Most likely you would send the NON-rotated controls into the animator however.
NOTE: your script above may be unsuitable for use with ground contact detection because it uses two (2) calls to Controller.Move().
I wrote about this before: the Unity example code in the API no longer jumps reliably.
If you call .Move() twice in one single frame, the grounded check may fail.
I reported it to Unity via their docs feedback in October 2020. Apparently it is still broken:
Here is a work-around:
I recommend you also go to that same documentation page and ALSO report that the code is broken.
When you report it, you are welcome to link the above workaround. One day the docs might get fixed.
If you would prefer something more full-featured here is a super-basic starter prototype FPS based on Character Controller (BasicFPCC):
That one has run, walk, jump, slide, crouch… it’s crazy-nutty!!