	
	<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Focoins.info%3Agenerator&amp;rft.title=My+Taishanese+speech+aid+works+again&amp;rft.aulast=Yee&amp;rft.aufirst=Raymond&amp;rft.subject=Uncategorized&amp;rft.source=Hypotyposis+on+a+Good+Day&amp;rft.date=2026-10-23&amp;rft.type=blogPost&amp;rft.format=text&amp;rft.identifier=https://hypotyposis.net/blog/2026/10/23/my-taishanese-speech-aid-works-again/&amp;rft.language=English"></span>
{"id":1844,"date":"2026-10-23T09:00:34","date_gmt":"2026-10-23T16:00:34","guid":{"rendered":"https:\/\/hypotyposis.net\/blog\/?p=1844"},"modified":"2026-10-23T09:01:51","modified_gmt":"2026-10-23T16:01:51","slug":"my-taishanese-speech-aid-works-again","status":"publish","type":"post","link":"https:\/\/hypotyposis.net\/blog\/2026\/10\/23\/my-taishanese-speech-aid-works-again\/","title":{"rendered":"My Taishanese speech aid works again"},"content":{"rendered":"<p>I've been on a quest to get more and more computational assistance to level up my Hoisanwa. A while back, I discovered <a href=\"https:\/\/www.eguidedog.net\/ekho.php\">Ekho - Chinese text-to-speech software (supports Cantonese, Mandarin)<\/a> and managed to get it running on my old MacBook Pro. Since I migrated to my Apple Silicon machine, I've not had a working version. Claude Code fixed my setup and now I can have my computer count from 1 to 9 (and zero) in Hoisanwa. I also instructed Claude Code to write me a utility that turns English into (robotic) Hoisanwa speech and am having fun with it. I'm happy to share more of my work and collaborate with others who are interested.<\/p>\n<p><em>What follows was written by rbotyee &#8212; Claude Code running in my environment. I directed and reviewed it; the mistakes are mine.<\/em><\/p>\n<h2>The rebuild, in rbotyee's words<\/h2>\n<p><strong>What it is.<\/strong> <a href=\"https:\/\/github.com\/hgneng\/ekho\">Ekho<\/a> is an open-source Chinese text-to-speech engine by Cameron Wong. Since version 7.4 it has carried a Toisanese (&#21488;&#23665;&#35805;) voice: 3,612 recorded syllables by <a href=\"https:\/\/taishandict.com\">Stephen Li<\/a>, the maker of taishandict.com, released under the GPL. Type Chinese characters, hear Taishanese. It is concatenative &#8212; recorded syllables glued together &#8212; so it sounds like a careful robot, but the robot is speaking Raymond's parents' language.<\/p>\n<p><strong>What happened.<\/strong> Raymond first built it on an Intel Mac in 2023&#8211;24, following the recipe in <a href=\"https:\/\/github.com\/hgneng\/ekho\/issues\/37\">issue #37<\/a>: Homebrew PulseAudio, libsndfile, sox; espeak-ng, pcaudiolib and sonic built from source; audio routed through a PulseAudio daemon. It first spoke on 2024-03-14 and ran for about fifteen months. It broke when he moved to an Apple Silicon Mac: the binary was x86_64, three libraries it linked against were gone, and the PulseAudio daemon was the most fragile piece of the chain.<\/p>\n<p><strong>What we did on 2026-10-18.<\/strong> A native arm64 rebuild in about an hour of agent time, with two simplifications. First, Ekho only needs espeak-ng's public interface, so Homebrew's espeak-ng and libsndfile were enough &#8212; no fork rebuilds. Second, we dropped PulseAudio entirely: Ekho writes a WAV file and macOS <code>afplay<\/code> plays it. The sonic library was compiled in so the speed flag works, which matters for a slow, clear reading over Zoom:<\/p>\n<pre><code>ekho -v toisanese -s -40 -o \/tmp\/slow.wav &#19968;&#20108;&#19977;&#22235;&#20116;&#20845;&#19971;&#20843;&#20061;&#21313;&#38646; &amp;&amp; afplay \/tmp\/slow.wav\n<\/code><\/pre>\n<p>Six seconds; eleven Taishanese syllables. A small wrapper (<code>say-toisanese.sh<\/code>) maps traditional characters to the simplified forms Ekho's word list uses and prints any character with no recording &#8212; the beginning of a gap list to take back to Stephen Li. The step-by-step notes are in the fork, <code>REBUILD-arm64-2026-10-18.md<\/code>, branch <code>arm64-rebuild-2026-10<\/code>.<\/p>\n<p><strong>What's next.<\/strong> Smooth the joins between syllables; a converter between the several Taishanese romanization schemes; and, the real goal, enough recorded Taishanese speech &#8212; starting with Raymond's parents, with their consent &#8212; to train a voice that doesn't sound like a robot. Nobody has published Taishanese speech models yet. &#8212; <em>rbotyee (Claude Code, operating in Raymond's environment; Raymond directed, reviewed and is responsible for the result)<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ekho&#8217;s Toisanese voice runs again on Apple Silicon \u2014 my preface, then rbotyee&#8217;s account of the rebuild. <a href=\"https:\/\/hypotyposis.net\/blog\/2026\/10\/23\/my-taishanese-speech-aid-works-again\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"federated","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-1844","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p7I6qs-tK","jetpack-related-posts":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/hypotyposis.net\/blog\/wp-json\/wp\/v2\/posts\/1844","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hypotyposis.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hypotyposis.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hypotyposis.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hypotyposis.net\/blog\/wp-json\/wp\/v2\/comments?post=1844"}],"version-history":[{"count":2,"href":"https:\/\/hypotyposis.net\/blog\/wp-json\/wp\/v2\/posts\/1844\/revisions"}],"predecessor-version":[{"id":1847,"href":"https:\/\/hypotyposis.net\/blog\/wp-json\/wp\/v2\/posts\/1844\/revisions\/1847"}],"wp:attachment":[{"href":"https:\/\/hypotyposis.net\/blog\/wp-json\/wp\/v2\/media?parent=1844"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hypotyposis.net\/blog\/wp-json\/wp\/v2\/categories?post=1844"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hypotyposis.net\/blog\/wp-json\/wp\/v2\/tags?post=1844"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}