Though it’s unlikely to help, if you haven’t already done so, try rebooting the entire networking path: Power off modem, router/firewall, PBX. Power up modem, wait for it to come ready, then power up router/firewall. When it’s ready, turn the PBX back on.
Next, DMZ (on a consumer router) is generally not a good idea. It simply tells the router to send packets that would otherwise be discarded to a specific LAN address. If possible, put the Internet Box in bridge mode (so it acts as a dumb modem and the router/firewall gets a public IP on its WAN interface). If not, use port range forwarding instead of DMZ.
Make sure that any SIP ALG is disabled.
If you still have trouble, see whether RTP from the trunk is coming into the PBX. If so, why isn’t it playing (wrong port, wrong codec, etc.)? If not, confirm that the outgoing INVITE has the correct IP address and port in the SDP. If necessary, capture traffic on the WAN interface of the router/firewall and check for RTP there. If also not, open a ticket with the trunking provider to ask where the RTP was being sent.
Oops, I just realized that the statement in your post “the caller can’t hear the called person” (which I answered) conflicts with the title “caller not heard” (which I did not address).
This is a good practice.
It’s best not to use a router as a DMZ, but rather as a NAT to forward ports to your FreePBX system.
It’s necessary to forward the SIP protocol, usually set to 5060/UDP, to your FreePBX system, as well as the RPT port range (10000 to 20000).
So here, two rules are applied.
If you encounter the same problem again, try using TCPDump and analyze the result with Wireshark.
This will allow you to verify the consistency of the RTP protocol.
Also, check the consistency of the SDP codecs.
Check INVITE too.