Commit Graph

204 Commits

Author SHA1 Message Date
Nolan Darilek 031e0ff23f Fix more queuing issues under WinRT. 2020-11-03 12:02:16 -06:00
Nolan Darilek 6b74afe503 Remove unused variable. 2020-11-03 11:24:09 -06:00
Nolan Darilek 289a35dc83 Don't double-speak previous item when not flushing queue. 2020-11-03 11:20:02 -06:00
Nolan Darilek 9c98026978 Don't re-initialize a player, just clear the item list. 2020-11-03 11:11:49 -06:00
Nolan Darilek d3e05b5a7a Revert "Pass TTS instance as first argument to utterance callbacks."
This appears to break callbacks, and is of limited utility.

This reverts commit 29c0a8463e.
2020-11-03 11:03:55 -06:00
Nolan Darilek 29c0a8463e Pass TTS instance as first argument to utterance callbacks. 2020-11-02 22:40:30 -06:00
Nolan Darilek cf0ad2221e Derive Debug. 2020-11-02 21:44:47 -06:00
Nolan Darilek 551bb1292e Make `TTS` clonable.
Also, add other possibly useful derives.
2020-11-02 21:27:13 -06:00
Nolan Darilek 565aa6d654 Fix issue where is_speaking always returns true under WinRT, and bump version. 2020-11-02 13:30:39 -06:00
Nolan Darilek 5feede0b8f Remove unnecessary debug logs. 2020-11-02 10:11:53 -06:00
Nolan Darilek 0bbda0a90f Remove WinRT code for handling paused player state, which caused issues with queued speech. 2020-10-30 10:23:24 -05:00
Nolan Darilek e66b8403aa Remove unnecessary full module names. 2020-10-14 03:54:53 -05:00
Nolan Darilek a281d74e5c Whitespace fix. 2020-10-14 03:51:08 -05:00
Nolan Darilek 51837a51bf Document feature. 2020-10-08 19:08:18 -05:00
Nolan Darilek fa216a534e Gate Tolk behind use_tolk feature to support compilation on UWP. 2020-10-08 19:07:07 -05:00
Nolan Darilek 88ec7db075 Eliminate accidental deadlock. 2020-10-08 09:44:46 -05:00
Nolan Darilek 0c13c43a77 Fix incorrect error code name. 2020-10-08 08:16:01 -05:00
Nolan Darilek 6f12974ce4 Implement stop callback on MacOS. 2020-10-08 08:07:33 -05:00
Nolan Darilek 8c783205c3 Implement utterance_stop callback on most platforms. 2020-10-08 07:56:45 -05:00
Nolan Darilek 174011bbb4 Make `UtteranceId` use `u64` on most platforms, and add additional derives. 2020-10-08 07:16:10 -05:00
François Caddet d2c42d97f5 the voices::Backend trait is almost stable 2020-09-28 11:18:54 +02:00
François Caddet 3294a82485 some fixes
now build on macOS
2020-09-27 20:35:40 +02:00
François Caddet e19eb56169 first implementation of a voice trait for macOS
WARN: not tested
2020-09-27 20:04:12 +02:00
François Caddet f7297e18fd add condition for macOS 11 and greater for default backend 2020-09-26 23:39:30 +02:00
François Caddet f78aed211f fix conflicts 2020-09-26 23:36:15 +02:00
Francois Caddet 8c8dc0ae9f add voices value returned by the backends 2020-09-26 23:03:56 +02:00
Nolan Darilek c2bbc5ac04 Eliminate more Clippy warnings. 2020-09-26 12:47:18 -05:00
Nolan Darilek dbac8a3fe0 Eliminate some Clippy warnings. 2020-09-26 12:43:16 -05:00
Francois Caddet 47cbb80595 Merge branch 'develop' into feature/voices 2020-09-26 18:20:10 +02:00
Nolan Darilek ace5d2fd1f Make compatible with newly-released speech-dispatcher-rs. 2020-09-25 11:33:49 -05:00
Nolan Darilek 589c613bbe Implement FnMut callbacks on AV Foundation, and fix warnings. 2020-09-25 11:14:26 -05:00
Nolan Darilek 1f22843086 Refactor Linux, Windows, and Wasm platforms to use FnMut for callbacks, and bump version. 2020-09-25 11:08:19 -05:00
Nolan Darilek 96e5d21e24 Implement callbacks for WinRT. 2020-09-24 17:56:46 -05:00
Nolan Darilek a22242af50 Implement callbacks for web backend. 2020-09-24 14:26:30 -05:00
Nolan Darilek 532d5d9b58 Tighten up access. 2020-09-23 12:23:46 -05:00
Nolan Darilek 251fb8d8c1 Implement callbacks on AVFoundation. 2020-09-23 12:21:05 -05:00
Nolan Darilek bd57075d53 Implement unused framework for AVFoundation callbacks. 2020-09-23 11:28:56 -05:00
Nolan Darilek 36a12597de Merge branch 'v0.7' of https://github.com/ndarilek/tts-rs into v0.7 2020-09-23 11:00:41 -05:00
Nolan Darilek 6788277a4d Implement framework for utterance callbacks in Windows backends, though they aren't currently called. 2020-09-23 10:31:21 -05:00
Nolan Darilek 61522610cd Implement utterance begin/end callback framework, and set up for Speech-Dispatcher. 2020-09-23 10:12:51 -05:00
Nolan Darilek f5f11b7cdf Switch to using MediaPlaybackItem as WinRT utterance ID. 2020-09-22 14:51:59 -05:00
Nolan Darilek 017aa8863b Remove unused import and fix i~~OS builds. 2020-09-22 14:30:17 -05:00
Nolan Darilek 6b023c3071 Add AV Foundation support for returning utterance IDs. 2020-09-22 14:08:19 -05:00
Nolan Darilek 4816ec575c Make speak calls return an utterance ID, where possible. 2020-09-22 12:40:03 -05:00
Nolan Darilek d6508edd12 Remove workaround for incorrect Tolk string handling, pin minimum working version, and bump version. 2020-09-21 15:13:22 -05:00
François Caddet 97f1de5724 Merge branch 'develop' into feature/voices 2020-09-05 12:27:19 +02:00
François Caddet 335ac710a6 add unimplemented functions forvoices feature on every backends 2020-09-05 12:07:51 +02:00
François Caddet b238c8c938 fix return type of AVSpeechSynthesisVoice:new 2020-09-05 11:30:11 +02:00
François Caddet 0fb6c62d83 fix some parameters types and implement set_voice
We have an ilegal hardware instruction in
backend::av_foundation::voices::AVSpeechSynthesisVoice::new(identifier)
when sending voiceWithIdentifier. Is it because the runLoop is not
runing when it's called?
2020-09-04 15:48:56 +02:00
François Caddet 6ed94686f3 implement set_voice for AVFoundation backend
- TODO: test the implementation
- fixed: set_voice mutability of self parameter
2020-09-03 18:40:32 +02:00
François Caddet 5b0d1b6621 Add voices feature
Implemented for AVFoundation backend but set_voice has no effect for now
Warning: does not build on Linux or windows for now
2020-09-03 16:50:11 +02:00
Nolan Darilek 665013fdff Split text sent to Tolk backend to account for some sort of length limit.
Tolk seems to fail on strings larger than 325 characters in length. Here we:
* Send any strings with 300 or fewer characters through directly.
* For larger strings, split on whitespace boundaries, then create and send buffers of 300 or fewer characters.

This may not handle internationalized text, and may not handle someone bombarding TTS with a giant word. PRs for either welcome.
2020-09-02 11:40:08 -05:00
Nolan Darilek 6c091f3284 Switch Speech-dispatcher initialization to threaded mode so callbacks work and `is_speaking` is correct. 2020-08-25 11:50:25 -05:00
Nolan Darilek d3ffd5078f cargo fmt 2020-08-24 16:46:57 -05:00
Nolan Darilek 1507527175 Add `Default` implementation for `Features` so backends need only specify features they actually support. 2020-08-24 16:44:00 -05:00
Nolan Darilek 951e31b284 Implement `is_speaking` For Speech-dispatcher. 2020-08-19 21:28:30 -05:00
Nolan Darilek 7bcbda15b3 Update supported platforms. 2020-08-18 15:22:12 -05:00
Nolan Darilek a1e4215ea7 Normal volume of speech-dispatcher is 100, not 0. 2020-08-18 15:19:34 -05:00
Nolan Darilek 2f85c3b2bf Add iOS build. 2020-08-18 15:16:30 -05:00
Nolan Darilek cce1569c72 Sync supported synths in README and lib.rs. 2020-08-13 11:15:23 -05:00
Nolan Darilek ff877acd87 Eliminate warning in non-MacOS builds. 2020-08-13 11:11:38 -05:00
Nolan Darilek c5b1ff1944 Add AVFoundation backend, used automatically on MacOS 10.14 and above. 2020-08-13 11:08:00 -05:00
Nolan Darilek 2d0ab8889a Eliminate a warning. 2020-08-13 06:58:16 -05:00
Nolan Darilek cc2a4c12f7 Rename ns_speech_synthesizer backend to appkit. 2020-08-13 06:46:16 -05:00
Nolan Darilek af678d76d1 Update documentation with supported backends. 2020-08-12 15:45:16 -05:00
Nolan Darilek 75fd320d3f Implement rate/volume-setting for `NSSpeechSynthesizer`, along with other tweaks.
Unfortunately, there seems to be a difference in how the `hello_world` example processes rate and volume changes. I'm not sure if it doesn't adjust rate for samples while speaking. In any case, arguably there are just going to be differences in platforms that I can't account for, so this may just have to be. Hopefully it doesn't interfere with actual usage.
2020-08-12 15:41:57 -05:00
Nolan Darilek dc1c00f446 Good news: `NSSpeechSynthesizer` speech now queues. Bad news: my brain bleeds. 2020-08-12 15:14:17 -05:00
Nolan Darilek 7eccb9f573 Clean up `println!` and comparison calls. 2020-08-12 09:54:25 -05:00
Nolan Darilek 427ca027be Add `Drop` implementation. 2020-08-12 09:52:16 -05:00
Nolan Darilek 47bfe768e6 Get delegates working so speech interruption/queuing should now be possible.
* Fix broken delegate method signature.
* Add `NSRunLoop` into `hello_world` example so delegates are called. Presumably, MacOS apps already run one of these, but the example didn't.
2020-08-12 09:49:51 -05:00
Nolan Darilek faadc0e3b7 Still doesn't work, but at least it doesn't segfault now. 2020-08-11 14:44:52 -05:00
Nolan Darilek 753f6c5ecd WIP: Initial support for MacOS/`NSSpeechSynthesizer`.
* Add necessary dependencies, build script, and `NSSpeechSynthesizer` backend.
* Get very basic speech working.

Needs a delegate to handle queued speech, and currently segfaults if one is set.
2020-08-11 12:11:19 -05:00
Nolan Darilek e1bb6741a9 Correctly indicate that WinRT supports detection of speaking. 2020-07-07 09:08:44 -05:00
Nolan Darilek 16a6f6378a Under WinRT, recreate player completely when interruption is requested. 2020-07-06 12:52:18 -05:00
Nolan Darilek 1d7c668a4a Sanity-check value to prevent overflow. 2020-07-06 12:14:50 -05:00
Nolan Darilek d830f44c55 Handle corner case where WinRT speech that doesn't interrupt, and is played after a delay, causes recently-spoken utterances to replay.
`MediaPlayer` only seems to have states for playing and paused, but not stopped. Further, playing when the queue is finished seems to restart playback from the beginning.

Here we clear the list of items to play if the player is paused and we're on the last item. We assume we're done with all items to speak, and clear the list before appending a new item and beginning playback again.

The correct solution is probably to investigate how events work in winrt-rs, but callbacks and Rust have always been a disaster when I've tried them, so I'm hesitant. This does seem to handle the basic scenarios I've thrown at it.
2020-06-17 18:54:34 -05:00
Nolan Darilek ce8c5f5289 Refactor to use separate `tts_winrt_bindings` crate, and bump version. 2020-06-17 17:25:43 -05:00
Nolan Darilek 45c7b1afc7 Various WinRT refinements.
* Move autogenerated code to subcrate to speed up compilation.
* `is_speaking` also checks whether a source is opening, in addition to whether it is playing.
* Return to using autoplay.
2020-06-17 16:46:42 -05:00
Nolan Darilek 10a9d56ae5 Remove autoplay setting. 2020-06-14 20:03:11 -05:00
Nolan Darilek 933e850919 Ensure that `MediaPlayer` for speech is playing. 2020-06-14 19:42:48 -05:00
Nolan Darilek 1526602ad8 Don't close `MediaPlayer` when stopping speech, and actually support interruption. 2020-06-14 18:56:01 -05:00
Nolan Darilek 4f011e6895 Get Tolk working again.
Two Tolk instances were being created. One checked for the presence of a screen reader. The other actually performed the speech, and was returned as part of the `TTS` instance.

Unfortunately, Tolk doesn't seem to appreciate being called twice. So here we check if a screen reader is detected and, if one is, return the instance that did the detection. Otherwise, error out and return the WinRT backend.
2020-06-11 13:00:24 -05:00
Nolan Darilek c82ea5f3b3 WinRT fixes.
* Use released `winrt` crate.
* Implement `is_speaking`.
2020-06-09 11:00:37 -05:00
Nolan Darilek d004404e4d Forgot we have to fully-qualify the type here. 2020-06-02 16:59:04 -05:00
Nolan Darilek d46b886875 Remove JavaScript error from non-JavaScript builds. 2020-06-02 14:57:21 -05:00
Nolan Darilek c24c1d3230 Implement support for detecting when TTS is speaking. 2020-06-02 14:53:14 -05:00
Nolan Darilek 7b4fb8dae4 Clean up speech synthesis properties, and implement everything for WinRT.
I'd previously attempted to normalize everything to `u8`, but this had some drawbacks:

 * It failed to account for some synthesis drivers defining normal as mid-range, while most define it very low.
 * It didn't track the normal value for a given synthesizer.
 * There was no clean way to map a curve between the minimum, normal, and maximum rates.

Here we track the minimum, normal, and maximum values of rate, pitch, and volume. Sanity checks are done on set.

Also, as a further proof-of-concept, all properties are now implemented for the WinRT driver.
2020-05-18 18:12:59 -05:00
Nolan Darilek 3198a537f0 Initial WinRT backend.
* Add WinRT backend
 * Refactor to use thiserror and unify error-handling
 * If a screen reader is detected. use Tolk. Otherwise, use the WinRT backend.
2020-05-18 15:14:09 -05:00
Nolan Darilek f4b4ba5184 Clippy and fmt. 2019-12-23 07:37:48 -06:00
Nolan Darilek 7488dcbe3a For single-character text, set punctuation to all so the text is spoken. 2019-09-30 10:36:51 -05:00
Nolan Darilek 36745f9850 Eliminate deprecation warning. 2019-09-30 10:36:20 -05:00
Nolan Darilek 1c1f38b55d Use new Tolk library and update backend. 2019-09-10 10:41:28 -05:00
Nolan Darilek 071eefbe0e Resolve merge conflict. 2019-03-25 19:21:02 +00:00
Nolan Darilek 3bda7bcff4 Add Tolk backend. 2019-03-25 19:15:08 +00:00
Nolan Darilek e388934e5e Support dynamic feature selection/use in example. 2019-03-25 16:34:30 +00:00
Nolan Darilek ac4ebea05a Create list of supported features and check them before a method is called. 2019-03-24 21:30:45 +00:00
Nolan Darilek f9558263ab Implement `Send` and `Sync` for `TTS`. 2019-01-03 17:20:04 +00:00
Nolan Darilek e82a10ba16 cargo fmt 2019-01-03 16:16:54 +00:00
Nolan Darilek 44f6c489cb Indicate support for WebAssembly. 2018-12-30 17:20:03 +00:00
Nolan Darilek 4fadad9d36 Add Web backend and refactor API. 2018-12-30 17:13:48 +00:00
Nolan Darilek 96722d7032 Add basic documentation. 2018-12-28 15:39:50 +00:00
Nolan Darilek 863ae0e8c3 Implement `stop()`. 2018-12-28 14:49:02 +00:00
Nolan Darilek e24ed9a3a3 Add support for volume and pitch. 2018-12-15 15:56:13 +00:00
Nolan Darilek bac4b7555f Initial commit. 2018-12-14 19:35:49 +00:00