@Override
  public List<Word> readWords() throws IOException, AuToBIException {
    Syllabifier syllabifier = new Syllabifier();
    List<Region> regions = syllabifier.generatePseudosyllableRegions(wav_data);
    for (Region r : regions) {
      r.setAttribute("wav", wav_data);
    }
    List<Word> words = new ArrayList<Word>();

    // Identify silent regions by mean intensity less than the threshold.
    IntensityFeatureExtractor ife = new IntensityFeatureExtractor("I");
    ContourFeatureExtractor cfe = new ContourFeatureExtractor("I");
    try {
      ife.extractFeatures(regions);
      cfe.extractFeatures(regions);
    } catch (FeatureExtractorException e) {
      throw new AuToBIException("Error extracting intensity: " + e.getMessage());
    }

    for (Region r : regions) {
      if ((Double) r.getAttribute("I__mean") >= threshold) {
        words.add(new Word(r.getStart(), r.getEnd(), "", "", wav_data.getFilename()));
      }
    }

    if (annotation_file != null) {
      // TODO: include a way to read ToBI annotations from an annotation file and align to the pseudosyllable words.
      // Sample code:
//      TextGridReader reader = new TextGridReader(annotation_file);
//      reader.readWords();
//      Tier tones_tier = reader.getTonesTier();
      // do the alignment.
    }
    return words;
  }