Site icon C1CTech

Android highlight a word in TextToSpeech

&NewLine;<p>This post is about how to highlight the word while speech is running in <span style&equals;"color&colon; &num;0000ff&semi;"><strong><a style&equals;"color&colon; &num;0000ff&semi;" href&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;android-text-to-speech-example&sol;">TextToSpeech<&sol;a><&sol;strong><&sol;span>&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<div class&equals;"wp-block-buttons aligncenter is-layout-flex wp-block-buttons-is-layout-flex">&NewLine;<div class&equals;"wp-block-button"><a class&equals;"wp-block-button&lowbar;&lowbar;link has-white-color has-text-color has-background" href&equals;"https&colon;&sol;&sol;github&period;com&sol;arunk7839&sol;HighlightTextDemo" style&equals;"background-color&colon;&num;520599" target&equals;"&lowbar;blank" rel&equals;"noreferrer noopener"><strong>DOWNLOAD CODE<&sol;strong><&sol;a><&sol;div>&NewLine;<&sol;div>&NewLine;&NewLine;&NewLine;&NewLine;<figure class&equals;"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class&equals;"wp-block-embed&lowbar;&lowbar;wrapper">&NewLine;<span class&equals;"embed-youtube" style&equals;"text-align&colon;center&semi; display&colon; block&semi;"><amp-youtube data-videoid&equals;"V8-iR0vpwXw" data-param-rel&equals;"1" data-param-showsearch&equals;"0" data-param-showinfo&equals;"1" data-param-iv&lowbar;load&lowbar;policy&equals;"1" data-param-fs&equals;"1" data-param-hl&equals;"en-US" data-param-autohide&equals;"2" data-param-wmode&equals;"transparent" width&equals;"1200" height&equals;"675" layout&equals;"responsive"><a href&equals;"https&colon;&sol;&sol;www&period;youtube&period;com&sol;watch&quest;v&equals;V8-iR0vpwXw" placeholder><amp-img src&equals;"https&colon;&sol;&sol;i&period;ytimg&period;com&sol;vi&sol;V8-iR0vpwXw&sol;hqdefault&period;jpg" alt&equals;"YouTube Poster" layout&equals;"fill" object-fit&equals;"cover"><noscript><img src&equals;"https&colon;&sol;&sol;i&period;ytimg&period;com&sol;vi&sol;V8-iR0vpwXw&sol;hqdefault&period;jpg" loading&equals;"lazy" decoding&equals;"async" alt&equals;"YouTube Poster"><&sol;noscript><&sol;amp-img><&sol;a><&sol;amp-youtube><&sol;span>&NewLine;<&sol;div><&sol;figure>&NewLine;&NewLine;&NewLine;&NewLine;<h3 class&equals;"wp-block-heading"><strong><span style&equals;"color&colon; &num;000080&semi;">Creating new project<&sol;span><&sol;strong><&sol;h3>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"p1"><b>1<&sol;b>&period; Create a new project by going to&nbsp&semi;<span style&equals;"color&colon; &num;008000&semi;"><b>File&nbsp&semi;<&sol;b><span class&equals;"s1"><b>&Implies;<&sol;b><&sol;span><&sol;span><b><span style&equals;"color&colon; &num;008000&semi;">&nbsp&semi;New Android Project<&sol;span>&comma;<&sol;b>&nbsp&semi;fill the required details and then click on&nbsp&semi;<span style&equals;"color&colon; &num;008000&semi;"><strong>finish<&sol;strong><&sol;span>&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p class&equals;"p1"><span style&equals;"font-size&colon; inherit&semi;"> <&sol;span><b>2<&sol;b>&period; The below layout file consist of two textView and a button to trigger a event that will highlight the word while speech is running in <span style&equals;"color&colon; &num;0000ff&semi;"><strong><span style&equals;"color&colon; &num;008000&semi;">TextToSpeech<&sol;span>&period;<&sol;strong><&sol;span><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>activity&lowbar;main&period;xml<&sol;strong><&sol;span><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">&lt&semi;&quest;xml version&equals;"1&period;0" encoding&equals;"utf-8"&quest;&gt&semi;<br>&lt&semi;androidx&period;constraintlayout&period;widget&period;ConstraintLayout xmlns&colon;android&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res&sol;android"<br> xmlns&colon;app&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;apk&sol;res-auto"<br> xmlns&colon;tools&equals;"http&colon;&sol;&sol;schemas&period;android&period;com&sol;tools"<br> android&colon;layout&lowbar;width&equals;"match&lowbar;parent"<br> android&colon;layout&lowbar;height&equals;"match&lowbar;parent"<br> tools&colon;context&equals;"&period;MainActivity"&gt&semi;<br><br> &lt&semi;TextView<br> android&colon;id&equals;"&commat;&plus;id&sol;tv&lowbar;text&lowbar;to&lowbar;speech"<br> android&colon;layout&lowbar;width&equals;"match&lowbar;parent"<br> android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;50dp"<br> android&colon;gravity&equals;"center"<br> android&colon;text&equals;"&commat;string&sol;text&lowbar;to&lowbar;speech"<br> android&colon;textColor&equals;"&commat;color&sol;colorPrimaryDark"<br> android&colon;textSize&equals;"&commat;dimen&sol;textSize&lowbar;30sp"<br> android&colon;textStyle&equals;"bold"<br> app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"parent"<br> app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"parent"<br> app&colon;layout&lowbar;constraintTop&lowbar;toTopOf&equals;"parent" &sol;&gt&semi;<br><br> &lt&semi;TextView<br> android&colon;id&equals;"&commat;&plus;id&sol;tv&lowbar;text"<br> android&colon;layout&lowbar;width&equals;"match&lowbar;parent"<br> android&colon;layout&lowbar;height&equals;"100dp"<br> android&colon;layout&lowbar;marginLeft&equals;"&commat;dimen&sol;margin&lowbar;10dp"<br> android&colon;layout&lowbar;marginRight&equals;"&commat;dimen&sol;margin&lowbar;10dp"<br> android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;30dp"<br> android&colon;background&equals;"&commat;drawable&sol;background"<br> android&colon;textColor&equals;"&commat;color&sol;colorPrimaryDark"<br> android&colon;padding&equals;"&commat;dimen&sol;padding&lowbar;8dp"<br> app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"parent"<br> android&colon;textSize&equals;"&commat;dimen&sol;textSize&lowbar;25sp"<br> app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;tv&lowbar;text&lowbar;to&lowbar;speech"<br> app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;tv&lowbar;text&lowbar;to&lowbar;speech" &sol;&gt&semi;<br> <br> &lt&semi;Button<br> android&colon;id&equals;"&commat;&plus;id&sol;btn&lowbar;speak&lowbar;text"<br> android&colon;layout&lowbar;width&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;height&equals;"wrap&lowbar;content"<br> android&colon;layout&lowbar;marginTop&equals;"&commat;dimen&sol;margin&lowbar;30dp"<br> android&colon;background&equals;"&commat;color&sol;colorPrimary"<br> android&colon;padding&equals;"&commat;dimen&sol;padding&lowbar;12dp"<br> android&colon;onClick&equals;"startClicked"<br> android&colon;text&equals;"&commat;string&sol;speak&lowbar;text"<br> android&colon;textColor&equals;"&commat;android&colon;color&sol;white"<br> android&colon;textSize&equals;"&commat;dimen&sol;textSize&lowbar;18sp"<br> android&colon;textStyle&equals;"bold"<br> app&colon;layout&lowbar;constraintEnd&lowbar;toEndOf&equals;"&commat;&plus;id&sol;tv&lowbar;text"<br> app&colon;layout&lowbar;constraintStart&lowbar;toStartOf&equals;"&commat;&plus;id&sol;tv&lowbar;text"<br> app&colon;layout&lowbar;constraintTop&lowbar;toBottomOf&equals;"&commat;&plus;id&sol;tv&lowbar;text" &sol;&gt&semi;<br><br>&lt&semi;&sol;androidx&period;constraintlayout&period;widget&period;ConstraintLayout&gt&semi;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p><div class&equals;"article-post-image"><strong>3<&sol;strong>&period; Open&nbsp&semi;<strong><span style&equals;"color&colon; &num;008000&semi;">MainActivity&period;java<&sol;span>&comma;<&sol;strong>&nbsp&semi;implement it from&nbsp&semi;<span style&equals;"color&colon; &num;0000ff&semi;"><strong>TextToSpeech&period;OnInitListener&nbsp&semi;<&sol;strong><&sol;span>and add the below code<strong>&period;<&sol;strong><&sol;div><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>MainActivity&period;java<&sol;strong><&sol;span><&sol;p>&NewLine;<&excl;-- WP QUADS Content Ad Plugin v&period; 2&period;0&period;98&period;1 -->&NewLine;<div class&equals;"quads-location quads-ad2" id&equals;"quads-ad2" style&equals;"float&colon;none&semi;margin&colon;0px&semi;">&NewLine;&NewLine;<&sol;div>&NewLine;&NewLine;&NewLine;&NewLine;&NewLine;<pre class&equals;"wp-block-preformatted">package com&period;c1ctech&period;highlighttextdemo&semi;<br><br>import android&period;graphics&period;Color&semi;<br>import android&period;os&period;Bundle&semi;<br>import android&period;speech&period;tts&period;TextToSpeech&semi;<br>import android&period;speech&period;tts&period;UtteranceProgressListener&semi;<br>import android&period;text&period;Spannable&semi;<br>import android&period;text&period;SpannableString&semi;<br>import android&period;text&period;Spanned&semi;<br>import android&period;text&period;style&period;ForegroundColorSpan&semi;<br>import android&period;util&period;Log&semi;<br>import android&period;view&period;View&semi;<br>import android&period;widget&period;TextView&semi;<br><br>import androidx&period;appcompat&period;app&period;AppCompatActivity&semi;<br><br>public class MainActivity extends AppCompatActivity implements TextToSpeech&period;OnInitListener &lbrace;<br> TextToSpeech tts&semi;<br><br> String sentence &equals; "The quick brown fox jumps over the lazy dog&period;"&semi;<br><br> TextView textView&semi;<br><br> &commat;Override<br> protected void onCreate&lpar;Bundle savedInstanceState&rpar; &lbrace;<br><br> super&period;onCreate&lpar;savedInstanceState&rpar;&semi;<br> setContentView&lpar;R&period;layout&period;activity&lowbar;main&rpar;&semi;<br><br> textView &equals; findViewById&lpar;R&period;id&period;tv&lowbar;text&rpar;&semi;<br> textView&period;setText&lpar;sentence&rpar;&semi;<br><br> <span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol; creating TTS instance<&sol;strong><&sol;span><br> tts &equals; new TextToSpeech&lpar;this&comma; this&rpar;&semi;<br><br> &rcub;<br><br> public void onInit&lpar;int status&rpar; &lbrace;<br><br> tts&period;setOnUtteranceProgressListener&lpar;new UtteranceProgressListener&lpar;&rpar; &lbrace;<br><br> &commat;Override<br> public void onStart&lpar;String utteranceId&rpar; &lbrace;<br> Log&period;i&lpar;"TTS"&comma; "utterance started"&rpar;&semi;<br> &rcub;<br><br> &commat;Override<br> public void onDone&lpar;String utteranceId&rpar; &lbrace;<br> Log&period;i&lpar;"TTS"&comma; "utterance done"&rpar;&semi;<br> &rcub;<br><br> &commat;Override<br> public void onError&lpar;String utteranceId&rpar; &lbrace;<br> Log&period;i&lpar;"TTS"&comma; "utterance error"&rpar;&semi;<br> &rcub;<br><br> &commat;Override<br> public void onRangeStart&lpar;String utteranceId&comma;<br> final int start&comma;<br> final int end&comma;<br> int frame&rpar; &lbrace;<br> Log&period;i&lpar;"TTS"&comma; "onRangeStart&lpar;&rpar; &period;&period;&period; utteranceId&colon; " &plus; utteranceId &plus; "&comma; start&colon; " &plus; start<br> &plus; "&comma; end&colon; " &plus; end &plus; "&comma; frame&colon; " &plus; frame&rpar;&semi;<br><br><br> <span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol; onRangeStart &lpar;and all UtteranceProgressListener callbacks&rpar; do not run on main thread<&sol;strong><&sol;span><br><span style&equals;"color&colon; &num;008000&semi;"><strong> &sol;&sol; &period;&period;&period; so we explicitly manipulate views on the main thread&colon;<&sol;strong><&sol;span><br> runOnUiThread&lpar;new Runnable&lpar;&rpar; &lbrace;<br> &commat;Override<br> public void run&lpar;&rpar; &lbrace;<br><br> Spannable textWithHighlights &equals; new SpannableString&lpar;sentence&rpar;&semi;<br><br> textWithHighlights&period;setSpan&lpar;new ForegroundColorSpan&lpar;Color&period;RED&rpar;&comma; start&comma; end&comma; Spanned&period;SPAN&lowbar;INCLUSIVE&lowbar;INCLUSIVE&rpar;&semi;<br> textView&period;setText&lpar;textWithHighlights&rpar;&semi;<br><br> &rcub;<br> &rcub;&rpar;&semi;<br> &rcub;<br> &rcub;&rpar;&semi;<br><br> &rcub;<br><br> public void startClicked&lpar;View ignored&rpar; &lbrace;<br><br> tts&period;speak&lpar;sentence&comma; TextToSpeech&period;QUEUE&lowbar;FLUSH&comma; null&comma; "UNIQUE&lowbar;UTTERANCE&lowbar;ID"&rpar;&semi;<br><br> &rcub;<br><br> &commat;Override<br> public void onDestroy&lpar;&rpar; &lbrace;<br> <span style&equals;"color&colon; &num;008000&semi;"><strong>&sol;&sol;don't forget to shutdown tts<&sol;strong><&sol;span><br> if &lpar;tts &excl;&equals; null&rpar; &lbrace;<br> tts&period;stop&lpar;&rpar;&semi;<br> tts&period;shutdown&lpar;&rpar;&semi;<br> &rcub;<br> super&period;onDestroy&lpar;&rpar;&semi;<br> &rcub;<br><br>&rcub;<&sol;pre>&NewLine;&NewLine;&NewLine;&NewLine;<p><strong><span style&equals;"color&colon; &num;000080&semi;">Note&colon;<&sol;span><&sol;strong> The <span style&equals;"color&colon; &num;008000&semi;"><strong>setOnUtteranceProgressListener&lpar;&rpar;<&sol;strong><&sol;span> method must be called before <span style&equals;"color&colon; &num;008000&semi;"><strong>speak&lpar;&rpar;<&sol;strong><&sol;span> is called&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<p>In the above code&comma;<span style&equals;"font-size&colon; inherit&semi;"> <&sol;span><&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<ul class&equals;"wp-block-list"><li><span style&equals;"color&colon; &num;0000ff&semi;"><strong>onInit&lpar;&rpar;<&sol;strong>&colon;<&sol;span> Called to signal the completion of the TextToSpeech engine initialization&period;<&sol;li><li class&equals;"p1"><span style&equals;"color&colon; &num;0000ff&semi;"><strong>speak&lpar;&rpar;<&sol;strong>&colon;<&sol;span> Speaks the text using the specified queuing strategy and speech parameters&period;<&sol;li><li><strong><span style&equals;"color&colon; &num;0000ff&semi;">onStart&lpar;&rpar;&colon;<&sol;span> <&sol;strong>called when speaking starts &lpar;soon after calling speak&lpar;&rpar;&rpar;&period;&nbsp&semi;<&sol;li><li><strong><span style&equals;"color&colon; &num;0000ff&semi;">onDone&lpar;&rpar;&colon;<&sol;span> <&sol;strong>called when speaking is finished&period;<&sol;li><li><strong><span style&equals;"color&colon; &num;0000ff&semi;">onError&lpar;&rpar;&colon;<&sol;span> <&sol;strong>called when an error has occurred during processing&period;<&sol;li><li><strong><span style&equals;"color&colon; &num;0000ff&semi;">onRangeStart&lpar;&rpar;&colon;<&sol;span> <&sol;strong>called when the TTS service is about to speak the specified range of the utterance with the given utteranceId&period;<&sol;li><li><span style&equals;"color&colon; &num;0000ff&semi;"><strong>stop&lpar;&rpar;<&sol;strong>&colon;<&sol;span> stop the speak&period;<&sol;li><li><span style&equals;"color&colon; &num;0000ff&semi;"><strong>shutdown&lpar;&rpar;<&sol;strong>&colon;<&sol;span> releases the resources used by the TextToSpeech engine&period;<&sol;li><&sol;ul>&NewLine;&NewLine;&NewLine;&NewLine;<p><strong>4<&sol;strong>&period; Now run your project and test your app by clicking the button&period;<&sol;p>&NewLine;&NewLine;&NewLine;&NewLine;<div class&equals;"wp-block-image"><figure class&equals;"aligncenter is-resized"><img src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2021&sol;02&sol;Screenshot&lowbar;1612178630&period;png" alt&equals;"" class&equals;"wp-image-2357" width&equals;"403" height&equals;"716"&sol;><&sol;figure><&sol;div>&NewLine;&NewLine;

Exit mobile version