package marytts.util.data.text; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import marytts.util.data.text.PraatPitchTier.PitchTarget; import marytts.util.dom.DomUtils; import marytts.util.math.MathUtils; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; import static org.junit.Assert.*; public class PraatPitchTierTest { private PraatPitchTier pt; private PraatPitchTier spt; private void assertTimesStrictlyIncreasing(PitchTarget[] targets) { for (int i = 1; i < targets.length; i++) { assertTrue(targets[i].time > targets[i - 1].time); } } @Before public void setUpDefault() throws Exception { Reader pitchTierFile = new InputStreamReader(getClass().getResourceAsStream("pop001.PitchTier"), "UTF-8"); pt = new PraatPitchTier(pitchTierFile); } @Before public void setUpShort() throws Exception { Reader shortPitchTierFile = new InputStreamReader(getClass().getResourceAsStream("pop001_short.PitchTier"), "UTF-8"); spt = new PraatPitchTier(shortPitchTierFile); } @Test public void canReadPitchFileDefault() throws Exception { assertNotNull(pt); assertEquals(0, pt.getXmin(), 1.e-7); assertEquals(2.52, pt.getXmax(), 1.e-7); assertEquals(109, pt.getNumTargets()); assertEquals(pt.getNumTargets(), pt.getPitchTargets().length); assertNotNull(pt.getPitchTargets()[0]); } @Test public void canReadPitchFileShort() throws Exception { assertNotNull(spt); assertEquals(0, spt.getXmin(), 1.e-7); assertEquals(2.52, spt.getXmax(), 1.e-7); assertEquals(109, spt.getNumTargets()); assertEquals(spt.getNumTargets(), spt.getPitchTargets().length); assertNotNull(spt.getPitchTargets()[0]); } @Test(expected = IllegalArgumentException.class) public void chokeOnWrongFile1() throws Exception { String wrong = "this is a wrong first line"; new PraatPitchTier(new StringReader(wrong)); } @Test(expected = IllegalArgumentException.class) public void chokeOnWrongFile2() throws Exception { String wrong = PraatPitchTier.FIRSTLINE + "\nthis is a wrong second line"; new PraatPitchTier(new StringReader(wrong)); } @Test public void canWritePitchFileDefault() throws Exception { StringWriter sw = new StringWriter(); pt.writeTo(sw); String newFile = sw.toString(); PraatPitchTier newPT = new PraatPitchTier(new StringReader(newFile)); assertEquals(pt.getPitchTargets().length, newPT.getPitchTargets().length); } @Test public void canWritePitchFileShort() throws Exception { StringWriter sw = new StringWriter(); spt.writeTo(sw); String newFile = sw.toString(); PraatPitchTier newPT = new PraatPitchTier(new StringReader(newFile)); assertEquals(spt.getPitchTargets().length, newPT.getPitchTargets().length); } @Test public void canExportFramesDefault() { double step = 0.01; double[] frames = pt.toFrames(step); assertEquals((int) ((pt.getXmax() - pt.getXmin()) / step + 1), frames.length); } @Test public void canExportFramesShort() { double step = 0.01; double[] frames = spt.toFrames(step); assertEquals((int) ((spt.getXmax() - spt.getXmin()) / step + 1), frames.length); } @Test public void canComputeFrequency() throws Exception { String simpleFile = PraatPitchTier.FIRSTLINE + "\n" + PraatPitchTier.SECONDLINE + "\n\n"; simpleFile += "0\n3\n" // from 0 to 3 seconds + "3\n" // four targets + "1\n100\n" // at 1 second, 100 Hz + "2\n200\n" // at 2 seconds, 200 Hz + "2.5\n300\n"; // at 2.5 seconds, 300 Hz PraatPitchTier simple = new PraatPitchTier(new StringReader(simpleFile)); assertTrue(Double.isNaN(simple.getFrequency(0))); assertTrue(Double.isNaN(simple.getFrequency(0.99))); assertEquals(100, simple.getFrequency(1), 1.e-7); assertEquals(150, simple.getFrequency(1.5), 1.e-7); assertEquals(175, simple.getFrequency(1.75), 1.e-7); assertEquals(200, simple.getFrequency(2), 1.e-7); assertEquals(250, simple.getFrequency(2.25), 1.e-7); assertEquals(300, simple.getFrequency(2.5), 1.e-7); assertTrue(Double.isNaN(simple.getFrequency(2.51))); assertTrue(Double.isNaN(simple.getFrequency(3))); } @Test public void canImportFramesDefault() { double step = 0.01; double[] frames = pt.toFrames(step); PraatPitchTier newPT = new PraatPitchTier(pt.getXmin(), frames, step); assertEquals(pt.getXmin(), newPT.getXmin(), 1.e-7); assertEquals(pt.getXmax(), newPT.getXmax(), step); // xmax will be less // precisely equal assertEquals(newPT.getNumTargets(), newPT.getPitchTargets().length); assertNotNull(newPT.getPitchTargets()[0]); assertTrue(MathUtils.sumSquaredError(pt.toFrames(step), newPT.toFrames(step)) < 1.e-30); } @Test public void canImportFramesShort() { double step = 0.01; double[] frames = spt.toFrames(step); PraatPitchTier newPT = new PraatPitchTier(spt.getXmin(), frames, step); assertEquals(spt.getXmin(), newPT.getXmin(), 1.e-7); assertEquals(spt.getXmax(), newPT.getXmax(), step); // xmax will be less // precisely equal assertEquals(newPT.getNumTargets(), newPT.getPitchTargets().length); assertNotNull(newPT.getPitchTargets()[0]); assertTrue(MathUtils.sumSquaredError(spt.toFrames(step), newPT.toFrames(step)) < 1.e-30); } @Test public void canParseBothTextFormats() { assertEquals(pt, spt); } @Test public void canCreateFromMaryXML() throws Exception { Document acoustparams = DomUtils.parseDocument(getClass().getResourceAsStream("pop001.dfki-poppy-hsmm.ACOUSTPARAMS")); PraatPitchTier ptM = new PraatPitchTier(acoustparams); assertNotNull(ptM); assertNotNull(ptM.getPitchTargets()); assertNotNull(ptM.toFrames(0.01)); assertTimesStrictlyIncreasing(ptM.getPitchTargets()); } }