docstr: x --- [N, seq_len, encoder_embedding_dim]
  mels --- [N, Ty/r, n_mels*r], r=1
  out --- [N, seq_len, bottleneck_size]
  attn --- [N, seq_len, ref_len], Ty/r = ref_len
docstr_tok: ["x","--","-","[","N",",","seq_len",",","encoder_embedding_dim","]","mels","--","-","[","N",",","Ty\/r",",","n_mels","*","r","]",",","r=1","out","--","-","[","N",",","seq_len",",","bottleneck_size","]","attn","--","-","[","N",",","seq_len",",","ref_len","]",",","Ty\/r","=","ref_len"]
code: def forward(
      self,
      x: torch.Tensor,
      src_mask: torch.Tensor,
      mels: torch.Tensor,
      mel_lens: torch.Tensor,
      encoding: torch.Tensor,
  ) -> torch.Tensor:
      """
      x --- [N, seq_len, encoder_embedding_dim]
      mels --- [N, Ty/r, n_mels*r], r=1
      out --- [N, seq_len, bottleneck_size]
      attn --- [N, seq_len, ref_len], Ty/r = ref_len
      """
      embedded_prosody, _, mel_masks = self.encoder(mels, mel_lens)
  
      # Bottleneck
      embedded_prosody = self.encoder_prj(embedded_prosody)
  
      attn_mask = mel_masks.view((mel_masks.shape[0], 1, 1, -1))
      x, _ = self.attention(
          query=x,
          key=embedded_prosody,
          value=embedded_prosody,
          mask=attn_mask,
          encoding=encoding,
      )
      x = self.encoder_bottleneck(x)
      x = x.masked_fill(src_mask.unsqueeze(-1), 0.0)
      return x
  
imports: from typing import List, Tuple, Union
  import torch
  import torch.nn
  import torch.nn.functional
  from TTS.tts.layers.delightful_tts.conformer import ConformerMultiHeadedSelfAttention
  from TTS.tts.layers.delightful_tts.conv_layers import CoordConv1d
  from TTS.tts.layers.delightful_tts.networks import STL
label_desc: Use image node_id 2 for calling the PhonemeLevelProsodyEncoder obj's underlying member method code with example usage: obj.forward(x, src_mask, mels, mel_lens, encoding) and returns: x