├── app ├── .gitkeep └── services │ ├── speech-reader.js │ └── speech-recorder.js ├── addon ├── .gitkeep ├── defaults │ └── recorder.js ├── services │ ├── speech-reader.js │ └── speech-recorder.js └── -privates │ └── reader.js ├── vendor └── .gitkeep ├── tests ├── unit │ ├── .gitkeep │ ├── services │ │ ├── speech-reader-test.js │ │ └── speech-recorder-test.js │ └── -privates │ │ └── reader-test.js ├── integration │ └── .gitkeep ├── dummy │ ├── app │ │ ├── helpers │ │ │ └── .gitkeep │ │ ├── models │ │ │ └── .gitkeep │ │ ├── routes │ │ │ ├── .gitkeep │ │ │ └── index.js │ │ ├── components │ │ │ ├── .gitkeep │ │ │ └── speakable-component.js │ │ ├── controllers │ │ │ ├── .gitkeep │ │ │ └── index.js │ │ ├── templates │ │ │ ├── components │ │ │ │ ├── .gitkeep │ │ │ │ └── speakable-component.hbs │ │ │ ├── application.hbs │ │ │ └── index.hbs │ │ ├── resolver.js │ │ ├── styles │ │ │ └── app.css │ │ ├── router.js │ │ ├── app.js │ │ └── index.html │ ├── public │ │ ├── robots.txt │ │ ├── images │ │ │ └── GitHub-Mark-32px.png │ │ └── crossdomain.xml │ └── config │ │ └── environment.js ├── test-helper.js ├── helpers │ ├── destroy-app.js │ ├── resolver.js │ ├── start-app.js │ └── module-for-acceptance.js ├── .jshintrc └── index.html ├── assets ├── vendor-d41d8cd98f00b204e9800998ecf8427e.css ├── dummy-ca616ce657a66d12c492b61650ef94c8.css └── dummy-7ed982097601083b311bfc03c8b52a90.js ├── .watchmanconfig ├── robots.txt ├── bower.json ├── .bowerrc ├── index.js ├── config ├── environment.js └── ember-try.js ├── images └── GitHub-Mark-32px-f87561b8bb354ef83b09a66e54f70e08.png ├── .npmignore ├── testem.js ├── .ember-cli ├── .gitignore ├── .editorconfig ├── crossdomain.xml ├── .jshintrc ├── ember-cli-build.js ├── LICENSE.md ├── .travis.yml ├── LICENSE ├── index.html ├── package.json └── README.md /app/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /addon/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vendor/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/unit/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/integration/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/helpers/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/models/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/routes/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/components/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/controllers/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/dummy/app/templates/components/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/vendor-d41d8cd98f00b204e9800998ecf8427e.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | { 2 | "ignore_dirs": ["tmp", "dist"] 3 | } 4 | -------------------------------------------------------------------------------- /robots.txt: -------------------------------------------------------------------------------- 1 | # http://www.robotstxt.org 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ember-speak", 3 | "dependencies": {} 4 | } 5 | -------------------------------------------------------------------------------- /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "bower_components", 3 | "analytics": false 4 | } 5 | -------------------------------------------------------------------------------- /tests/dummy/public/robots.txt: -------------------------------------------------------------------------------- 1 | # http://www.robotstxt.org 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /app/services/speech-reader.js: -------------------------------------------------------------------------------- 1 | export { default } from 'ember-speak/services/speech-reader'; 2 | -------------------------------------------------------------------------------- /app/services/speech-recorder.js: -------------------------------------------------------------------------------- 1 | export { default } from 'ember-speak/services/speech-recorder'; 2 | -------------------------------------------------------------------------------- /tests/dummy/app/resolver.js: -------------------------------------------------------------------------------- 1 | import Resolver from 'ember-resolver'; 2 | 3 | export default Resolver; 4 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /* jshint node: true */ 2 | 'use strict'; 3 | 4 | module.exports = { 5 | name: 'ember-speak' 6 | }; 7 | -------------------------------------------------------------------------------- /assets/dummy-ca616ce657a66d12c492b61650ef94c8.css: -------------------------------------------------------------------------------- 1 | pre{tab-size:2}.badges{margin-top:20px}.badge{display:inline-block;margin-top:25px} -------------------------------------------------------------------------------- /tests/dummy/public/images/GitHub-Mark-32px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsteuwer/ember-speak/HEAD/tests/dummy/public/images/GitHub-Mark-32px.png -------------------------------------------------------------------------------- /config/environment.js: -------------------------------------------------------------------------------- 1 | /*jshint node:true*/ 2 | 'use strict'; 3 | 4 | module.exports = function(/* environment, appConfig */) { 5 | return { }; 6 | }; 7 | -------------------------------------------------------------------------------- /tests/test-helper.js: -------------------------------------------------------------------------------- 1 | import resolver from './helpers/resolver'; 2 | import { 3 | setResolver 4 | } from 'ember-qunit'; 5 | 6 | setResolver(resolver); 7 | -------------------------------------------------------------------------------- /tests/helpers/destroy-app.js: -------------------------------------------------------------------------------- 1 | import Ember from 'ember'; 2 | 3 | export default function destroyApp(application) { 4 | Ember.run(application, 'destroy'); 5 | } 6 | -------------------------------------------------------------------------------- /images/GitHub-Mark-32px-f87561b8bb354ef83b09a66e54f70e08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsteuwer/ember-speak/HEAD/images/GitHub-Mark-32px-f87561b8bb354ef83b09a66e54f70e08.png -------------------------------------------------------------------------------- /tests/dummy/app/styles/app.css: -------------------------------------------------------------------------------- 1 | pre { 2 | tab-size: 2; 3 | } 4 | 5 | .badges { 6 | margin-top: 20px; 7 | } 8 | 9 | .badge { 10 | display: inline-block; 11 | margin-top: 25px; 12 | } 13 | -------------------------------------------------------------------------------- /tests/dummy/app/templates/application.hbs: -------------------------------------------------------------------------------- 1 | {{!-- The following component displays Ember's default welcome message. --}} 2 | {{welcome-page}} 3 | {{!-- Feel free to remove this! --}} 4 | 5 | {{outlet}} 6 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /bower_components 2 | /config/ember-try.js 3 | /dist 4 | /tests 5 | /tmp 6 | **/.gitkeep 7 | .bowerrc 8 | .editorconfig 9 | .ember-cli 10 | .gitignore 11 | .jshintrc 12 | .watchmanconfig 13 | .travis.yml 14 | bower.json 15 | ember-cli-build.js 16 | testem.js 17 | -------------------------------------------------------------------------------- /testem.js: -------------------------------------------------------------------------------- 1 | /*jshint node:true*/ 2 | module.exports = { 3 | "framework": "qunit", 4 | "test_page": "tests/index.html?hidepassed", 5 | "disable_watching": true, 6 | "launch_in_ci": [ 7 | "PhantomJS" 8 | ], 9 | "launch_in_dev": [ 10 | "PhantomJS", 11 | "Chrome" 12 | ] 13 | }; 14 | -------------------------------------------------------------------------------- /tests/dummy/app/router.js: -------------------------------------------------------------------------------- 1 | import Ember from 'ember'; 2 | import config from './config/environment'; 3 | 4 | const Router = Ember.Router.extend({ 5 | location: config.locationType, 6 | rootURL: config.rootURL 7 | }); 8 | 9 | Router.map(function() { 10 | }); 11 | 12 | export default Router; 13 | -------------------------------------------------------------------------------- /.ember-cli: -------------------------------------------------------------------------------- 1 | { 2 | /** 3 | Ember CLI sends analytics information by default. The data is completely 4 | anonymous, but there are times when you might want to disable this behavior. 5 | 6 | Setting `disableAnalytics` to true will prevent any data from being sent. 7 | */ 8 | "disableAnalytics": false 9 | } 10 | -------------------------------------------------------------------------------- /tests/helpers/resolver.js: -------------------------------------------------------------------------------- 1 | import Resolver from '../../resolver'; 2 | import config from '../../config/environment'; 3 | 4 | const resolver = Resolver.create(); 5 | 6 | resolver.namespace = { 7 | modulePrefix: config.modulePrefix, 8 | podModulePrefix: config.podModulePrefix 9 | }; 10 | 11 | export default resolver; 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | 7 | # dependencies 8 | /node_modules 9 | /bower_components 10 | 11 | # misc 12 | /.sass-cache 13 | /connect.lock 14 | /coverage/* 15 | /libpeerconnection.log 16 | npm-debug.log* 17 | testem.log 18 | *.swp 19 | */*.swp 20 | -------------------------------------------------------------------------------- /addon/defaults/recorder.js: -------------------------------------------------------------------------------- 1 | import Ember from 'ember'; 2 | 3 | const { 4 | computed, 5 | } = Ember; 6 | 7 | export default Ember.Object.extend(Ember.Evented, { 8 | fullTranscript: '', 9 | isAvailable: computed.bool('_available').readOnly(), 10 | isRecording: computed.bool('_recording').readOnly(), 11 | _available: false, 12 | _recording: false, 13 | }); 14 | -------------------------------------------------------------------------------- /tests/dummy/app/templates/components/speakable-component.hbs: -------------------------------------------------------------------------------- 1 |
Install the addon.
88 |ember install ember-speak89 |
Inject the service(s) into whichever object you need it in.
90 |import Ember from 'ember';
91 |
92 | export default Route.Controller.extend({
93 | speechRecorder: Ember.inject.service(),
94 | speechReader: Ember.inject.service(),
95 | model() {
96 | return Ember.Object.create({
97 | recorderAvailable: this.get('speechRecorder.isAvailable'),
98 | readerAvailable: this.get('speechReader.isAvailable'),
99 | });
100 | },
101 | });
102 | One thing I wish sites did were to allow their articles to be read by my phone. This is now as simple as creating a single component. So, while I'm on my mobile device, I can hit play and let it read the entire thing to me while I drive. Here's an example:
111 | speakable-component: JavaScript, Template 112 |