23 #include "synth_thread.h"
25 #include <alsa/asoundlib.h>
26 #include <interfaces/SpeechSynthInterface.h>
27 #include <utils/time/wait.h>
34 extern cst_voice *register_cmu_us_kal(
const char *voxdir);
35 extern void unregister_cmu_us_kal(cst_voice *voice);
46 :
Thread(
"FliteSynthThread",
Thread::OPMODE_WAITFORWAKEUP),
55 voice_ = register_cmu_us_kal(NULL);
62 say(
"Speech synth loaded");
68 unregister_cmu_us_kal(voice_);
108 cst_wave *wave = flite_text_to_wave(text, voice_);
109 cst_wave_save_riff(wave,
"/tmp/test.wav");
114 speechsynth_if_->
write();
120 speechsynth_if_->
write();
124 FliteSynthThread::get_duration(cst_wave *wave)
126 return (
float)cst_wave_num_samples(wave) / (float)cst_wave_sample_rate(wave);
133 FliteSynthThread::play_wave(cst_wave *wave)
136 float duration = get_duration(wave);
138 if ((err = snd_pcm_open(&pcm, cfg_soundcard_.c_str(), SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
139 throw Exception(
"Failed to open PCM: %s", snd_strerror(err));
141 snd_pcm_nonblock(pcm, 0);
142 if ((err = snd_pcm_set_params(pcm,
143 SND_PCM_FORMAT_S16_LE,
144 SND_PCM_ACCESS_RW_INTERLEAVED,
145 cst_wave_num_channels(wave),
146 cst_wave_sample_rate(wave),
148 (
unsigned int)roundf(duration * 1000000.)))
150 throw Exception(
"Playback to set params: %s", snd_strerror(err));
153 snd_pcm_sframes_t frames;
154 frames = snd_pcm_writei(pcm, cst_wave_samples(wave), cst_wave_num_samples(wave));
157 frames = snd_pcm_recover(pcm, frames, 0);
161 }
else if (frames < (
long)cst_wave_num_samples(wave)) {
163 "Short write (expected %li, wrote %li)",
164 (
long)cst_wave_num_samples(wave),
168 TimeWait::wait_systime((
unsigned int)roundf(duration * 1000000.f));