docstr: Returns actual metric score, either pesq or stoi
  
  Arguments
  ---------
  batch_id : list of str
      A list of the utterance ids for the batch
  deg_wav : torch.Tensor
      The degraded waveform to score
  ref_wav : torch.Tensor
      The reference waveform to use for scoring
  length : torch.Tensor
      The relative lengths of the utterances
docstr_tok: ["Returns","actual","metric","score",",","either","pesq","or","stoi","Arguments","--","--","--","--","-","batch_id",":","list","of","str","A","list","of","the","utterance","ids","for","the","batch","deg_wav",":","torch.Tensor","The","degraded","waveform","to","score","ref_wav",":","torch.Tensor","The","reference","waveform","to","use","for","scoring","length",":","torch.Tensor","The","relative","lengths","of","the","utterances"]
code: def score(self, batch_id, deg_wav, ref_wav, lens):
      """Returns actual metric score, either pesq or stoi
  
      Arguments
      ---------
      batch_id : list of str
          A list of the utterance ids for the batch
      deg_wav : torch.Tensor
          The degraded waveform to score
      ref_wav : torch.Tensor
          The reference waveform to use for scoring
      length : torch.Tensor
          The relative lengths of the utterances
      """
      new_ids = [
          i
          for i, d in enumerate(batch_id)
          if d not in self.historical_set and d not in self.noisy_scores
      ]
  
      if len(new_ids) == 0:
          pass
      elif self.hparams.target_metric == "pesq":
          self.target_metric.append(
              ids=[batch_id[i] for i in new_ids],
              predict=deg_wav[new_ids].detach(),
              target=ref_wav[new_ids].detach(),
              lengths=lens[new_ids],
          )
          score = torch.tensor(
              [[s] for s in self.target_metric.scores],
              device=self.device,
          )
      elif self.hparams.target_metric == "stoi":
          self.target_metric.append(
              [batch_id[i] for i in new_ids],
              deg_wav[new_ids],
              ref_wav[new_ids],
              lens[new_ids],
              reduction="batch",
          )
          score = torch.tensor(
              [[-s] for s in self.target_metric.scores],
              device=self.device,
          )
      else:
          raise ValueError(
              "Expected 'pesq' or 'stoi' for target_metric"
          )
  
      # Clear metric scores to prepare for next batch
      self.target_metric.clear()
  
      # Combine old scores and new
      final_score = []
      for i, d in enumerate(batch_id):
          if d in self.historical_set:
              final_score.append([self.historical_set[d]["score"]])
          elif d in self.noisy_scores:
              final_score.append([self.noisy_scores[d]])
          else:
              final_score.append([score[new_ids.index(i)]])
  
      return torch.tensor(final_score, device=self.device)
  
imports: import os
  import sys
  import shutil
  import pickle
  import torch
  import torchaudio
  import speechbrain
  from pesq import pesq
  from enum import Enum, auto
  from hyperpyyaml import load_hyperpyyaml
  from speechbrain.utils.metric_stats import MetricStats
  from speechbrain.processing.features import spectral_magnitude
  from speechbrain.nnet.loss.stoi_loss import stoi_loss
  from speechbrain.utils.distributed import run_on_main
  from speechbrain.dataio.sampler import ReproducibleWeightedRandomSampler
label_desc: Use image node_id 7 for calling the MetricGanBrain obj's underlying member method code with example usage: obj.score(batch_id, deg_wav, ref_wav, lens) and returns: torch