[PAID] PlayAI TTS- Generate AI TTS in 30+ AI Voices (Male & Female) at 10x faster inference

🧩 PlayAI

An extension for MIT App Inventor 2.
PlayAI TTS Extension to generate and play audio using PlayAI models running 10x faster on Groq.
My other extensions
Built by Sarthak Gupta

:memo: Specifications


:package: Package: com.playai
:floppy_disk: Size: 59.61 KB
:gear: Version: 1.0
:iphone: Minimum API Level: 7
:date: Updated On: 2025-05-22T18:30:00Z
:computer: Built & documented using: FAST v3.4.0

Voice Demo

The demo files are generated using the PlayAI Extension! These are the demo voices of 4 models. We have 30+ voices to choose from.

Events:

AudioGenerated_Event

ErrorOccurred_Event

PlayAI has total 2 events.

:yellow_heart: AudioGenerated

Triggered when audio is successfully generated. Returns the file path to the mp3 file

Parameter Type
filePath text

:yellow_heart: ErrorOccurred

Triggered when an error occurs during audio generation or playback

Parameter Type
errorMessage text

Methods:

GenerateAudio_Method
PlayTTS_Method

PlayAI has total 2 methods.

:purple_heart: GenerateAudio

Generates TTS audio from the input text using the Groq API

Parameter Type
text text

:purple_heart: PlayTTS

Plays the TTS audio file at the specified file path

Parameter Type
filePath text

Setters:

ApiKey_Set_Property
Voice_Set_Property
PlayAI has total 2 setter properties.

:green_heart: Voice

Gets the current voice

  • Input type: text
  • Voices: Arista, Atlas, Basil, Briggs, Calum, Celeste, Cheyenne, Chip, Cillian, Deedee, Fritz, Gail, Indigo, Mamaw, Mason, Mikail, Mitch, Quinn, Thunder

:green_heart: ApiKey

Sets the API key for Groq

  • Input type: text

Purchase the extension

The extensions is available for just 7.99$

FAQ

What is the PlayAI extension?

PlayAI extension enables you to generate AI TTS in real time in 30+ male/female voices.

How do I get the api key?

Generate an api key from groq.com

I want to bulk purchase the extension for my institution.

Dm me or contact me via mail at support@sarthakdev.in

What is the license terms of the extension?

The license terms for all of my extensions is available here

1 Like

Test PlayAI Extension

Try the PlayAI TTS extension for free in this Test APK
Download APK from here

Wrote an in depth guide about Groq API and the benefits you get in free plan.

Hello, I bought your extension but I don't know how to configure it. Could you send me a tutorial or something? Please.

1 Like

The documentation of all blocks is available above.
Just set your api key from the Groq console. Generate tts and play it using the blocks.
Its that simple. If you want I will send a sample aia.

I'm so sorry. I'm really desperate. I've already tried programming it and I can't. Please, I need a little more help. And sorry for the trouble.

1 Like

No problems. I will send you all the details via dm

Hello,
I tried to compile my project using this extension with MIT app inventor and received all possible errors. The list was really long. Does this extension work only with Kodular? I used the paid version of it. I can enclosure the error list.

1 Like

what about providing the error log here?
the releant part is at the end

Taifun

1 Like

I made a sample app and compiled in both appinventor and kodular. No errors at my end. Would you please share the AIA privately in my dm along with the error log.

So I may be able to help :slightly_smiling_face:

Thanks for your answer. Here is the full error log:
App Inventor is unable to compile this project.
The compiler error output was
[ReadBuildInfo] Starting Task
[ReadBuildInfo] Task succeeded in 0.004 seconds
[LoadComponentInfo] Starting Task
[LoadComponentInfo] INFO: Generating assets...
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify assets
[LoadComponentInfo] Component assets needed, n = 0
[LoadComponentInfo] INFO: Generating activities...
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify activities
[LoadComponentInfo] Component activities needed, n = 1
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify activityMetadata
[LoadComponentInfo] Component activity metadata needed, n = 0
[LoadComponentInfo] INFO: Generating broadcast receivers...
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify broadcastReceivers
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify contentProviders
[LoadComponentInfo] INFO: Generating libraries...
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify libraries
[LoadComponentInfo] Libraries needed, n = 0
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify metadata
[LoadComponentInfo] Component metadata needed, n = 0
[LoadComponentInfo] INFO: Generating Android minimum SDK...
[LoadComponentInfo] INFO: Generating native libraries...
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify native
[LoadComponentInfo] Native Libraries needed, n = 0
[LoadComponentInfo] INFO: Generating permissions...
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify permissions
[LoadComponentInfo] usesLocation = False
[LoadComponentInfo] Permissions needed, n = 5
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify queries
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify services
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify xmls
[LoadComponentInfo] Component xmls needed, n = 0
[LoadComponentInfo] INFO: Generating component broadcast receivers...
[LoadComponentInfo] INFO: Component "com.playai.PlayAI" does not specify broadcastReceiver
[LoadComponentInfo] Task succeeded in 0.005 seconds
[PrepareAppIcon] Starting Task
[PrepareAppIcon] INFO: Creating mipmap dirs...
[PrepareAppIcon] INFO: Generating icons...
[PrepareAppIcon] Generating icons for mipmap-mdpi
[PrepareAppIcon] Generating icons for mipmap-hdpi
[PrepareAppIcon] Generating icons for mipmap-xhdpi
[PrepareAppIcon] Generating icons for mipmap-xxhdpi
[PrepareAppIcon] Generating icons for mipmap-xxxhdpi
[PrepareAppIcon] Task succeeded in 0.973 seconds
[XmlConfig] Starting Task
[XmlConfig] INFO: Creating animation xml
[XmlConfig] Creating zoom_enter.xml
[XmlConfig] Creating fadeout.xml
[XmlConfig] Creating slide_v_exit.xml
[XmlConfig] Creating fadein.xml
[XmlConfig] Creating zoom_exit.xml
[XmlConfig] Creating slide_v_enter.xml
[XmlConfig] Creating zoom_exit_reverse.xml
[XmlConfig] Creating slide_v_enter_reverse.xml
[XmlConfig] Creating zoom_enter_reverse.xml
[XmlConfig] Creating slide_enter_reverse.xml
[XmlConfig] Creating slide_exit.xml
[XmlConfig] Creating hold.xml
[XmlConfig] Creating slide_enter.xml
[XmlConfig] Creating slide_v_exit_reverse.xml
[XmlConfig] Creating slide_exit_reverse.xml
[XmlConfig] INFO: Creating style xml
[XmlConfig] INFO: Creating provider_path xml
[XmlConfig] INFO: Creating network_security_config xml
[XmlConfig] INFO: Generating adaptive icon file
[XmlConfig] INFO: Generating round adaptive icon file
[XmlConfig] INFO: Generating adaptive icon background file
[XmlConfig] Task succeeded in 0.003 seconds
[CreateManifest] Starting Task
[CreateManifest] INFO: Reading project specs...
[CreateManifest] VCode: 1
[CreateManifest] VName: 1.0
[CreateManifest] Min SDK 19
[CreateManifest] INFO: Writing screen 'appinventor.ai_akowalski25.Voice.Screen1'
[CreateManifest] Task succeeded in 0.001 seconds
[AttachNativeLibs] Starting Task
[AttachNativeLibs] Task succeeded in 0.0 seconds
[AttachAarLibs] Starting Task
[AttachAarLibs] Task succeeded in 0.126 seconds
[AttachCompAssets] Starting Task
[AttachCompAssets] Task succeeded in 0.0 seconds
[MergeResources] Starting Task
[MergeResources] Task succeeded in 0.194 seconds
[SetupLibs] Starting Task
[SetupLibs] Task succeeded in 0.0 seconds
[RunAapt] Starting Task
[RunAapt] Task succeeded in 0.817 seconds
[GenerateClasses] Starting Task
[GenerateClasses] INFO: Source File: appinventor/ai_akowalski25/Voice/Screen1.yail
[GenerateClasses] INFO: Libraries Classpath = /tmp/kawa12559937867966990576.jar:/tmp/acra-4.4.014841725256258602313.jar:/tmp/AndroidRuntime12006070000021666008.jar:/tmp/annotation9784679111952459818.jar:/tmp/annotation-experimental16048271374563581493.jar:/tmp/appcompat13241813506037024643.jar:/tmp/asynclayoutinflater5088565286526182665.jar:/tmp/collection12786657214033236159.jar:/tmp/constraintlayout12265285753321060228.jar:/tmp/constraintlayout-solver17739279307806675273.jar:/tmp/coordinatorlayout3545741238893000499.jar:/tmp/core12161058660408587513.jar:/tmp/core-common334827800618711545.jar:/tmp/core-runtime12561857673542815962.jar:/tmp/cursoradapter5245921681067400839.jar:/tmp/customview18111338610214756453.jar:/tmp/documentfile9828806384508090068.jar:/tmp/drawerlayout8857969777303332235.jar:/tmp/fragment14163066329935026491.jar:/tmp/interpolator10342838616781720261.jar:/tmp/legacy-support-core-ui10210487622128274107.jar:/tmp/legacy-support-core-utils13374101867761424024.jar:/tmp/lifecycle-common11894174719267465829.jar:/tmp/lifecycle-livedata14609612817217936464.jar:/tmp/lifecycle-livedata-core8989620650692489181.jar:/tmp/lifecycle-runtime10043269590777434350.jar:/tmp/lifecycle-viewmodel10181062907817321524.jar:/tmp/loader12076007037474683901.jar:/tmp/localbroadcastmanager16912467500645115124.jar:/tmp/print5845066956164307328.jar:/tmp/slidingpanelayout16542510155397261168.jar:/tmp/swiperefreshlayout2359723971268921742.jar:/tmp/vectordrawable8836489238739366773.jar:/tmp/vectordrawable-animated18262614521712835537.jar:/tmp/versionedparcelable9136134704115383885.jar:/tmp/viewpager14203709684841898714.jar:/tmp/1755418607932_7679419556380622848-0/youngandroidproject/../assets/external_comps/com.playai/files/AndroidRuntime.jar:/tmp/1755418607932_7679419556380622848-0/youngandroidproject/../build/classes:/tmp/android15374755344525610920.jar
[GenerateClasses] ERROR: Kawa compile has failed.
(compiling appinventor/ai_akowalski25/Voice/Screen1.yail to appinventor.ai_akowalski25.Voice.Screen1)

ERROR: appinventor/ai_akowalski25/Voice/Screen1.yail line 21: caught exception in inliner for # - java.lang.VerifyError: Expecting a stackmap frame at branch target 481

Exception Details:
Location:
com/playai/helpers/PlayAIVoice.()V @454: if_icmpge
Reason:
Expected stackmap frame at this location.
Bytecode:
0000000: bb00 2959 1201 0312 02b7 0044 b300 2dbb
0000010: 0029 5912 0304 1204 b700 44b3 002e bb00
0000020: 2959 1205 0512 06b7 0044 b300 2fbb 0029
0000030: 5912 0706 1208 b700 44b3 0030 bb00 2959
0000040: 1209 0712 0ab7 0044 b300 31bb 0029 5912
0000050: 0b08 120c b700 44b3 0032 bb00 2959 120d
0000060: 1006 120e b700 44b3 0033 bb00 2959 120f
0000070: 1007 1210 b700 44b3 0034 bb00 2959 1211
0000080: 1008 1212 b700 44b3 0035 bb00 2959 1213
0000090: 1009 1214 b700 44b3 0036 bb00 2959 1215
00000a0: 100a 1216 b700 44b3 0037 bb00 2959 1217
00000b0: 100b 1218 b700 44b3 0038 bb00 2959 1219
00000c0: 100c 121a b700 44b3 0039 bb00 2959 121b
00000d0: 100d 121c b700 44b3 003a bb00 2959 121d
00000e0: 100e 121e b700 44b3 003b bb00 2959 121f
00000f0: 100f 1220 b700 44b3 003c bb00 2959 1221
0000100: 1010 1222 b700 44b3 003d bb00 2959 1223
0000110: 1011 1224 b700 44b3 003e bb00 2959 1225
0000120: 1012 1226 b700 44b3 003f 1013 bd00 2959
0000130: 03b2 002d 5359 04b2 002e 5359 05b2 002f
0000140: 5359 06b2 0030 5359 07b2 0031 5359 08b2
0000150: 0032 5359 1006 b200 3353 5910 07b2 0034
0000160: 5359 1008 b200 3553 5910 09b2 0036 5359
0000170: 100a b200 3753 5910 0bb2 0038 5359 100c
0000180: b200 3953 5910 0db2 003a 5359 100e b200
0000190: 3b53 5910 0fb2 003c 5359 1010 b200 3d53
00001a0: 5910 11b2 003e 5359 1012 b200 3f53 b300
00001b0: 42bb 002b 59b7 0049 b300 41b8 0046 594b
00001c0: be3c 033d 1c1b a200 1b2a 1c32 4eb2 0041
00001d0: 2db4 0040 2db9 004b 0300 5784 0201 a7ff
00001e0: e6b1

java.base/java.lang.Class.getDeclaredFields0(Native Method)
java.base/java.lang.Class.privateGetDeclaredFields(Unknown Source)
java.base/java.lang.Class.getDeclaredFields(Unknown Source)
gnu.bytecode.ClassType.addFields(ClassType.java:606)
gnu.bytecode.ClassType.getFields(ClassType.java:506)
gnu.bytecode.ClassType.getDeclaredField(ClassType.java:520)
gnu.bytecode.ClassType.getField(ClassType.java:539)
gnu.kawa.reflect.SlotGet.lookupMember(SlotGet.java:213)
gnu.kawa.reflect.CompileReflect.validateApplySlotGet(CompileReflect.java:144)
jdk.internal.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.base/java.lang.reflect.Method.invoke(Unknown Source)
gnu.expr.InlineCalls.maybeInline(InlineCalls.java:467)
gnu.expr.QuoteExp.validateApply(QuoteExp.java:150)
gnu.expr.ReferenceExp.validateApply(ReferenceExp.java:191)
gnu.kawa.functions.CompilationHelpers.validateApplyToArgs(CompilationHelpers.java:66)
jdk.internal.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.base/java.lang.reflect.Method.invoke(Unknown Source)
gnu.expr.InlineCalls.maybeInline(InlineCalls.java:467)
gnu.expr.QuoteExp.validateApply(QuoteExp.java:150)
gnu.expr.ReferenceExp.validateApply(ReferenceExp.java:191)
gnu.expr.InlineCalls.visitApplyExp(InlineCalls.java:119)
gnu.expr.InlineCalls.visitApplyExp(InlineCalls.java:28)
gnu.expr.ApplyExp.visit(ApplyExp.java:410)
gnu.expr.ExpVisitor.visit(ExpVisitor.java:51)
gnu.expr.InlineCalls.visit(InlineCalls.java:46)
gnu.expr.InlineCalls.visit(InlineCalls.java:28)
gnu.expr.ExpVisitor.visitAndUpdate(ExpVisitor.java:161)
gnu.expr.ExpVisitor.visitExps(ExpVisitor.java:175)
gnu.expr.ApplyExp.visitArgs(ApplyExp.java:415)
gnu.expr.LambdaExp.validateApply(LambdaExp.java:1737)
gnu.expr.ReferenceExp.validateApply(ReferenceExp.java:191)
gnu.kawa.functions.CompilationHelpers.validateApplyToArgs(CompilationHelpers.java:66)
jdk.internal.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.base/java.lang.reflect.Method.invoke(Unknown Source)
gnu.expr.InlineCalls.maybeInline(InlineCalls.java:467)
gnu.expr.QuoteExp.validateApply(QuoteExp.java:150)
gnu.expr.ReferenceExp.validateApply(ReferenceExp.java:191)
gnu.expr.InlineCalls.visitApplyExp(InlineCalls.java:119)
gnu.expr.InlineCalls.visitApplyExp(InlineCalls.java:28)
gnu.expr.ApplyExp.visit(ApplyExp.java:410)
gnu.expr.ExpVisitor.visit(ExpVisitor.java:51)
gnu.expr.InlineCalls.visit(InlineCalls.java:46)
gnu.expr.InlineCalls.visitBeginExp(InlineCalls.java:272)
gnu.expr.InlineCalls.visitBeginExp(InlineCalls.java:28)
gnu.expr.BeginExp.visit(BeginExp.java:156)
gnu.expr.ExpVisitor.visit(ExpVisitor.java:51)
gnu.expr.InlineCalls.visit(InlineCalls.java:46)
gnu.expr.InlineCalls.visitLetExp(InlineCalls.java:317)
gnu.expr.InlineCalls.visitLetExp(InlineCalls.java:28)
gnu.expr.LetExp.visit(LetExp.java:207)
gnu.expr.ExpVisitor.visit(ExpVisitor.java:51)
gnu.expr.InlineCalls.visit(InlineCalls.java:46)
gnu.expr.InlineCalls.visit(InlineCalls.java:28)
gnu.expr.LambdaExp.visitChildrenOnly(LambdaExp.java:1664)
gnu.expr.LambdaExp.visitChildren(LambdaExp.java:1651)
gnu.expr.InlineCalls.visitScopeExp(InlineCalls.java:279)
gnu.expr.InlineCalls.visitLambdaExp(InlineCalls.java:349)
gnu.expr.InlineCalls.visitLambdaExp(InlineCalls.java:28)
gnu.expr.LambdaExp.visit(LambdaExp.java:1640)
gnu.expr.ExpVisitor.visit(ExpVisitor.java:55)
gnu.expr.InlineCalls.visit(InlineCalls.java:46)
gnu.expr.InlineCalls.visitSetExpValue(InlineCalls.java:363)
gnu.expr.InlineCalls.visitSetExpValue(InlineCalls.java:28)
gnu.expr.ExpVisitor.visitSetExp(ExpVisitor.java:114)
gnu.expr.InlineCalls.visitSetExp(InlineCalls.java:369)
gnu.expr.InlineCalls.visitSetExp(InlineCalls.java:28)
gnu.expr.SetExp.visit(SetExp.java:406)
gnu.expr.ExpVisitor.visit(ExpVisitor.java:55)
gnu.expr.InlineCalls.visit(InlineCalls.java:46)
gnu.expr.InlineCalls.visitBeginExp(InlineCalls.java:272)
gnu.expr.InlineCalls.visitBeginExp(InlineCalls.java:28)
gnu.expr.BeginExp.visit(BeginExp.java:156)
gnu.expr.ExpVisitor.visit(ExpVisitor.java:51)
gnu.expr.InlineCalls.visit(InlineCalls.java:46)
gnu.expr.InlineCalls.visitBeginExp(InlineCalls.java:272)
gnu.expr.InlineCalls.visitBeginExp(InlineCalls.java:28)
gnu.expr.BeginExp.visit(BeginExp.java:156)
gnu.expr.ExpVisitor.visit(ExpVisitor.java:51)
gnu.expr.InlineCalls.visit(InlineCalls.java:46)
gnu.expr.InlineCalls.visit(InlineCalls.java:28)
gnu.expr.ExpVisitor.visitAndUpdate(ExpVisitor.java:161)
gnu.expr.ExpVisitor.visitExps(ExpVisitor.java:175)
gnu.expr.ApplyExp.visitArgs(ApplyExp.java:415)
gnu.kawa.functions.CompileMisc.validateApplyAppendValues(CompileMisc.java:139)
jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.base/java.lang.reflect.Method.invoke(Unknown Source)
gnu.expr.InlineCalls.maybeInline(InlineCalls.java:467)
gnu.expr.QuoteExp.validateApply(QuoteExp.java:150)
gnu.expr.InlineCalls.visitApplyExp(InlineCalls.java:119)
gnu.expr.InlineCalls.visitApplyExp(InlineCalls.java:28)
gnu.expr.ApplyExp.visit(ApplyExp.java:410)
gnu.expr.ExpVisitor.visit(ExpVisitor.java:55)
gnu.expr.InlineCalls.visit(InlineCalls.java:46)
gnu.expr.InlineCalls.visit(InlineCalls.java:28)
gnu.expr.LambdaExp.visitChildrenOnly(LambdaExp.java:1664)
gnu.expr.LambdaExp.visitChildren(LambdaExp.java:1651)
gnu.expr.InlineCalls.visitScopeExp(InlineCalls.java:279)
gnu.expr.InlineCalls.visitLambdaExp(InlineCalls.java:349)
gnu.expr.InlineCalls.visitLambdaExp(InlineCalls.java:28)
gnu.expr.ExpVisitor.visitModuleExp(ExpVisitor.java:103)
gnu.expr.ModuleExp.visit(ModuleExp.java:482)
gnu.expr.ExpVisitor.visit(ExpVisitor.java:51)
gnu.expr.InlineCalls.visit(InlineCalls.java:46)
gnu.expr.InlineCalls.inlineCalls(InlineCalls.java:33)
gnu.expr.Compilation.walkModule(Compilation.java:994)
gnu.expr.Compilation.process(Compilation.java:1965)
gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:330)
gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:315)
gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:315)
gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:315)
kawa.repl.compileFiles(repl.java:783)
kawa.repl.processArgs(repl.java:412)
kawa.repl.main(repl.java:827)
[GenerateClasses] ERROR: Can't find class file for Screen 'Screen1'
[GenerateClasses] Task errored in 2.272 seconds
.

1 Like

Hello :wave:
I think so you are a bit confused but lemme tell you that I am the developer of this extension. So I would be of better help to you. I instructed you to share the AIA with me privately so I will be able to fix it.
Please do the needful.

Hello,
Where do you want me to send aia? Regards

1 Like

Taifun

Extension Deprecated

Extension is now deprecated but don't worry. Existing users get access to the updated Groq Extension at a special upgrade offer. Please dm me.

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.