summaryrefslogtreecommitdiff
path: root/navit/support/espeak/sonic.h
diff options
context:
space:
mode:
Diffstat (limited to 'navit/support/espeak/sonic.h')
-rw-r--r--navit/support/espeak/sonic.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/navit/support/espeak/sonic.h b/navit/support/espeak/sonic.h
new file mode 100644
index 000000000..0afe7f85f
--- /dev/null
+++ b/navit/support/espeak/sonic.h
@@ -0,0 +1,138 @@
+/* Sonic library
+ Copyright 2010
+ Bill Cox
+ This file is part of the Sonic Library.
+
+ The Sonic Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/*
+The Sonic Library implements Pitch Based Resampling, which is a new algorithm
+invented by Bill Cox for the specific purpose of speeding up speech by high
+factors at high quality. It generates smooth speech at speed up factors as high
+as 6X, possibly more. It is also capable of slowing down speech, and generates
+high quality results regardless of the speed up or slow down factor. For
+speeding up speech by 2X or more, the following equation is used:
+
+ newSamples = period/(speed - 1.0)
+ scale = 1.0/newSamples;
+
+where period is the current pitch period, determined using AMDF or any other
+pitch estimator, and speed is the speedup factor. If the current position in
+the input stream is pointed to by "samples", and the current output stream
+position is pointed to by "out", then newSamples number of samples can be
+generated with:
+
+ out[t] = (samples[t]*(newSamples - t) + samples[t + period]*t)/newSamples;
+
+where t = 0 to newSamples - 1.
+
+For speed factors < 2X, an algorithm similar to PICOLA is used. The above
+algorithm is first used to double the speed of one pitch period. Then, enough
+input is directly copied from the input to the output to achieve the desired
+speed up facter, where 1.0 < speed < 2.0. The amount of data copied is derived:
+
+ speed = (2*period + length)/(period + length)
+ speed*length + speed*period = 2*period + length
+ length(speed - 1) = 2*period - speed*period
+ length = period*(2 - speed)/(speed - 1)
+
+For slowing down speech where 0.5 < speed < 1.0, a pitch period is inserted into
+the output twice, and length of input is copied from the input to the output
+until the output desired speed is reached. The length of data copied is:
+
+ length = period*(speed - 0.5)/(1 - speed)
+
+For slow down factors between 0.5 and 0.5, no data is copied, and an algorithm
+similar to high speed factors is used.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* This specifies the range of voice pitches we try to match.
+ Note that if we go lower than 65, we could overflow in findPitchInRange */
+#define SONIC_MIN_PITCH 65
+#define SONIC_MAX_PITCH 400
+
+/* These are used to down-sample some inputs to improve speed */
+#define SONIC_AMDF_FREQ 4000
+
+struct sonicStreamStruct;
+typedef struct sonicStreamStruct *sonicStream;
+
+/* For all of the following functions, numChannels is multiplied by numSamples
+ to determine the actual number of values read or returned. */
+
+/* Create a sonic stream. Return NULL only if we are out of memory and cannot
+ allocate the stream. Set numChannels to 1 for mono, and 2 for stereo. */
+sonicStream sonicCreateStream(int sampleRate, int numChannels);
+/* Destroy the sonic stream. */
+void sonicDestroyStream(sonicStream stream);
+/* Use this to write floating point data to be speed up or down into the stream.
+ Values must be between -1 and 1. Return 0 if memory realloc failed, otherwise 1 */
+int sonicWriteFloatToStream(sonicStream stream, float *samples, int numSamples);
+/* Use this to write 16-bit data to be speed up or down into the stream.
+ Return 0 if memory realloc failed, otherwise 1 */
+int sonicWriteShortToStream(sonicStream stream, short *samples, int numSamples);
+/* Use this to write 8-bit unsigned data to be speed up or down into the stream.
+ Return 0 if memory realloc failed, otherwise 1 */
+int sonicWriteUnsignedCharToStream(sonicStream stream, unsigned char *samples, int numSamples);
+/* Use this to read floating point data out of the stream. Sometimes no data
+ will be available, and zero is returned, which is not an error condition. */
+int sonicReadFloatFromStream(sonicStream stream, float *samples, int maxSamples);
+/* Use this to read 16-bit data out of the stream. Sometimes no data will
+ be available, and zero is returned, which is not an error condition. */
+int sonicReadShortFromStream(sonicStream stream, short *samples, int maxSamples);
+/* Use this to read 8-bit unsigned data out of the stream. Sometimes no data will
+ be available, and zero is returned, which is not an error condition. */
+int sonicReadUnsignedCharFromStream(sonicStream stream, unsigned char *samples, int maxSamples);
+/* Force the sonic stream to generate output using whatever data it currently
+ has. No extra delay will be added to the output, but flushing in the middle of
+ words could introduce distortion. */
+int sonicFlushStream(sonicStream stream);
+/* Return the number of samples in the output buffer */
+int sonicSamplesAvailable(sonicStream stream);
+/* Get the speed of the stream. */
+float sonicGetSpeed(sonicStream stream);
+/* Set the speed of the stream. */
+void sonicSetSpeed(sonicStream stream, float speed);
+/* Get the pitch of the stream. */
+float sonicGetPitch(sonicStream stream);
+/* Set the pitch of the stream. */
+void sonicSetPitch(sonicStream stream, float pitch);
+/* Get the scaling factor of the stream. */
+float sonicGetVolume(sonicStream stream);
+/* Set the scaling factor of the stream. */
+void sonicSetVolume(sonicStream stream, float volume);
+/* Get the sample rate of the stream. */
+int sonicGetSampleRate(sonicStream stream);
+/* Get the number of channels. */
+int sonicGetNumChannels(sonicStream stream);
+/* This is a non-stream oriented interface to just change the speed of a sound
+ sample. It works in-place on the sample array, so there must be at least
+ speed*numSamples available space in the array. Returns the new number of samples. */
+int sonicChangeFloatSpeed(float *samples, int numSamples, float speed, float pitch,
+ float volume, int sampleRate, int numChannels);
+/* This is a non-stream oriented interface to just change the speed of a sound
+ sample. It works in-place on the sample array, so there must be at least
+ speed*numSamples available space in the array. Returns the new number of samples. */
+int sonicChangeShortSpeed(short *samples, int numSamples, float speed, float pitch,
+ float volume, int sampleRate, int numChannels);
+
+#ifdef __cplusplus
+}
+#endif