@focus8/expo-acapela-tts 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,18 +12,14 @@ class ExpoAcapelaTtsModule : Module(), iTTSEventsCallback {
12
12
  private var tts: acattsandroid? = null
13
13
  private var isInitialized = false
14
14
  private var currentVoice: String? = null
15
- private var voicePaths = mutableListOf("/system/media/voices", "/data/media/voices")
15
+ private var voicePaths = mutableListOf("/sdcard/voices", "/system/media/voices", "/data/media/voices")
16
+ private var licenseUserId: Long? = null
17
+ private var licensePassword: Long? = null
18
+ private var licenseKey: String? = null
16
19
 
17
20
  companion object {
18
21
  private const val TAG = "ExpoAcapelaTts"
19
22
 
20
- private const val LICENSE_USER_ID = 0x34307771L
21
- private const val LICENSE_PASSWORD = 0x0008d44fL
22
- private const val LICENSE_KEY = "\"1976 0 qw04 #EVALUATION#Focus8\"\n" +
23
- "R%NUNVGz28KZdGZestTLeuatIwSRJoV8wn33qep6qR##\n" +
24
- "VOO8rYtC9QJpPfoX!8wlLrI@JXk3KnFJ%fhyL4AlArB!xoRq\n" +
25
- "UCNfz!@aiT9Sp88aLHnq\n"
26
-
27
23
  private var nativeLibLoaded = false
28
24
 
29
25
  init {
@@ -67,6 +63,13 @@ class ExpoAcapelaTtsModule : Module(), iTTSEventsCallback {
67
63
  }
68
64
  }
69
65
 
66
+ Function("setLicense") { userId: Long, password: Long, key: String ->
67
+ licenseUserId = userId
68
+ licensePassword = password
69
+ licenseKey = key
70
+ logInfo("License set")
71
+ }
72
+
70
73
  AsyncFunction("initializeAsync") {
71
74
  if (!nativeLibLoaded) {
72
75
  logWarning("Cannot initialize: native library not loaded")
@@ -78,6 +81,11 @@ class ExpoAcapelaTtsModule : Module(), iTTSEventsCallback {
78
81
  return@AsyncFunction true
79
82
  }
80
83
 
84
+ if (licenseUserId == null || licensePassword == null || licenseKey == null) {
85
+ logWarning("Cannot initialize: license not set. Call setLicense() first.")
86
+ return@AsyncFunction false
87
+ }
88
+
81
89
  try {
82
90
  val context = appContext.reactContext ?: run {
83
91
  logWarning("ReactContext not available")
@@ -86,7 +94,7 @@ class ExpoAcapelaTtsModule : Module(), iTTSEventsCallback {
86
94
 
87
95
  tts = acattsandroid(context, this@ExpoAcapelaTtsModule, null)
88
96
  tts!!.setLog(true)
89
- tts!!.setLicense(LICENSE_USER_ID, LICENSE_PASSWORD, LICENSE_KEY)
97
+ tts!!.setLicense(licenseUserId!!, licensePassword!!, licenseKey)
90
98
 
91
99
  val version = tts!!.version
92
100
  logInfo("Initialized, SDK version: $version")
@@ -109,8 +117,21 @@ class ExpoAcapelaTtsModule : Module(), iTTSEventsCallback {
109
117
 
110
118
  try {
111
119
  val voiceDirPaths = voicePaths.toTypedArray()
120
+ logInfo("getVoicesAsync: scanning paths: ${voiceDirPaths.joinToString()}")
121
+ for (path in voiceDirPaths) {
122
+ val dir = java.io.File(path)
123
+ if (dir.exists()) {
124
+ val files = dir.list() ?: emptyArray()
125
+ logInfo(" Path $path: exists=${dir.exists()}, canRead=${dir.canRead()}, entries=${files.size}")
126
+ } else {
127
+ logInfo(" Path $path: does not exist")
128
+ }
129
+ }
112
130
  val voicesList = tts!!.getVoicesList(voiceDirPaths) ?: emptyArray()
113
131
  logInfo("Found ${voicesList.size} voices")
132
+ for (v in voicesList) {
133
+ logInfo(" Voice: $v")
134
+ }
114
135
 
115
136
  val voices = voicesList.map { voiceName ->
116
137
  val info = tts!!.getVoiceInfo(voiceName) ?: emptyMap()
@@ -3,6 +3,7 @@ import { AcapelaVoice, ExpoAcapelaTtsModuleEvents } from './ExpoAcapelaTts.types
3
3
  declare class ExpoAcapelaTtsModule extends NativeModule<ExpoAcapelaTtsModuleEvents> {
4
4
  isAvailable(): boolean;
5
5
  addVoicePath(path: string): void;
6
+ setLicense(userId: number, password: number, key: string): void;
6
7
  initializeAsync(): Promise<boolean>;
7
8
  getVoicesAsync(): Promise<AcapelaVoice[]>;
8
9
  loadVoiceAsync(voiceName: string): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoAcapelaTtsModule.android.d.ts","sourceRoot":"","sources":["../src/ExpoAcapelaTtsModule.android.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,MAAM,CAAC;AAEzD,OAAO,EACL,YAAY,EACZ,0BAA0B,EAC3B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,OAAO,oBAAqB,SAAQ,YAAY,CAAC,0BAA0B,CAAC;IACjF,WAAW,IAAI,OAAO;IACtB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAChC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IACnC,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IACzC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IACnD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACzC,IAAI,IAAI,IAAI;IACZ,UAAU,IAAI,OAAO;IACrB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAC7B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAClC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAC/B;;AAED,wBAA2E"}
1
+ {"version":3,"file":"ExpoAcapelaTtsModule.android.d.ts","sourceRoot":"","sources":["../src/ExpoAcapelaTtsModule.android.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,MAAM,CAAC;AAEzD,OAAO,EACL,YAAY,EACZ,0BAA0B,EAC3B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,OAAO,oBAAqB,SAAQ,YAAY,CAAC,0BAA0B,CAAC;IACjF,WAAW,IAAI,OAAO;IACtB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAChC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAC/D,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IACnC,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IACzC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IACnD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACzC,IAAI,IAAI,IAAI;IACZ,UAAU,IAAI,OAAO;IACrB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAC7B,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAClC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAC/B;;AAED,wBAA2E"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoAcapelaTtsModule.android.js","sourceRoot":"","sources":["../src/ExpoAcapelaTtsModule.android.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAsBzD,eAAe,mBAAmB,CAAuB,gBAAgB,CAAC,CAAC","sourcesContent":["import { NativeModule, requireNativeModule } from 'expo';\n\nimport {\n AcapelaVoice,\n ExpoAcapelaTtsModuleEvents,\n} from './ExpoAcapelaTts.types';\n\ndeclare class ExpoAcapelaTtsModule extends NativeModule<ExpoAcapelaTtsModuleEvents> {\n isAvailable(): boolean;\n addVoicePath(path: string): void;\n initializeAsync(): Promise<boolean>;\n getVoicesAsync(): Promise<AcapelaVoice[]>;\n loadVoiceAsync(voiceName: string): Promise<boolean>;\n speakAsync(text: string): Promise<number>;\n stop(): void;\n isSpeaking(): boolean;\n setSpeechRate(rate: number): void;\n setPitch(pitch: number): void;\n setAudioBoost(boost: number): void;\n shutdownAsync(): Promise<void>;\n}\n\nexport default requireNativeModule<ExpoAcapelaTtsModule>('ExpoAcapelaTts');\n"]}
1
+ {"version":3,"file":"ExpoAcapelaTtsModule.android.js","sourceRoot":"","sources":["../src/ExpoAcapelaTtsModule.android.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAuBzD,eAAe,mBAAmB,CAAuB,gBAAgB,CAAC,CAAC","sourcesContent":["import { NativeModule, requireNativeModule } from 'expo';\n\nimport {\n AcapelaVoice,\n ExpoAcapelaTtsModuleEvents,\n} from './ExpoAcapelaTts.types';\n\ndeclare class ExpoAcapelaTtsModule extends NativeModule<ExpoAcapelaTtsModuleEvents> {\n isAvailable(): boolean;\n addVoicePath(path: string): void;\n setLicense(userId: number, password: number, key: string): void;\n initializeAsync(): Promise<boolean>;\n getVoicesAsync(): Promise<AcapelaVoice[]>;\n loadVoiceAsync(voiceName: string): Promise<boolean>;\n speakAsync(text: string): Promise<number>;\n stop(): void;\n isSpeaking(): boolean;\n setSpeechRate(rate: number): void;\n setPitch(pitch: number): void;\n setAudioBoost(boost: number): void;\n shutdownAsync(): Promise<void>;\n}\n\nexport default requireNativeModule<ExpoAcapelaTtsModule>('ExpoAcapelaTts');\n"]}
@@ -1,6 +1,7 @@
1
1
  declare const _default: {
2
2
  isAvailable(): boolean;
3
3
  addVoicePath(_path: string): void;
4
+ setLicense(_userId: number, _password: number, _key: string): void;
4
5
  initializeAsync(): Promise<boolean>;
5
6
  getVoicesAsync(): Promise<never[]>;
6
7
  loadVoiceAsync(_voiceName: string): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoAcapelaTtsModule.d.ts","sourceRoot":"","sources":["../src/ExpoAcapelaTtsModule.ts"],"names":[],"mappings":";mBAEiB,OAAO;wBAGF,MAAM;uBACD,OAAO,CAAC,OAAO,CAAC;;+BAMR,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;sBAGlC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;kBAIlC,OAAO;yBAGA,MAAM;qBACV,MAAM;0BACD,MAAM;;;;;;;AAvB9B,wBA6BE"}
1
+ {"version":3,"file":"ExpoAcapelaTtsModule.d.ts","sourceRoot":"","sources":["../src/ExpoAcapelaTtsModule.ts"],"names":[],"mappings":";mBAEiB,OAAO;wBAGF,MAAM;wBACN,MAAM,aAAa,MAAM,QAAQ,MAAM;uBAClC,OAAO,CAAC,OAAO,CAAC;;+BAMR,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;sBAGlC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;;kBAIlC,OAAO;yBAGA,MAAM;qBACV,MAAM;0BACD,MAAM;;;;;;;AAxB9B,wBA8BE"}
@@ -4,6 +4,7 @@ export default {
4
4
  return false;
5
5
  },
6
6
  addVoicePath(_path) { },
7
+ setLicense(_userId, _password, _key) { },
7
8
  async initializeAsync() {
8
9
  return false;
9
10
  },
@@ -1 +1 @@
1
- {"version":3,"file":"ExpoAcapelaTtsModule.js","sourceRoot":"","sources":["../src/ExpoAcapelaTtsModule.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,eAAe;IACb,WAAW;QACT,OAAO,KAAK,CAAC;IACf,CAAC;IACD,YAAY,CAAC,KAAa,IAAG,CAAC;IAC9B,KAAK,CAAC,eAAe;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,CAAC,cAAc;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,KAAK,CAAC,cAAc,CAAC,UAAkB;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,IAAI,KAAI,CAAC;IACT,UAAU;QACR,OAAO,KAAK,CAAC;IACf,CAAC;IACD,aAAa,CAAC,KAAa,IAAG,CAAC;IAC/B,QAAQ,CAAC,MAAc,IAAG,CAAC;IAC3B,aAAa,CAAC,MAAc,IAAG,CAAC;IAChC,KAAK,CAAC,aAAa,KAAI,CAAC;IACxB,WAAW;QACT,OAAO,EAAE,MAAM,KAAI,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,eAAe,KAAI,CAAC;CACrB,CAAC","sourcesContent":["// No-op stub for non-Android platforms\nexport default {\n isAvailable(): boolean {\n return false;\n },\n addVoicePath(_path: string) {},\n async initializeAsync(): Promise<boolean> {\n return false;\n },\n async getVoicesAsync() {\n return [];\n },\n async loadVoiceAsync(_voiceName: string): Promise<boolean> {\n return false;\n },\n async speakAsync(_text: string): Promise<number> {\n return -1;\n },\n stop() {},\n isSpeaking(): boolean {\n return false;\n },\n setSpeechRate(_rate: number) {},\n setPitch(_pitch: number) {},\n setAudioBoost(_boost: number) {},\n async shutdownAsync() {},\n addListener() {\n return { remove() {} };\n },\n removeListeners() {},\n};\n"]}
1
+ {"version":3,"file":"ExpoAcapelaTtsModule.js","sourceRoot":"","sources":["../src/ExpoAcapelaTtsModule.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,eAAe;IACb,WAAW;QACT,OAAO,KAAK,CAAC;IACf,CAAC;IACD,YAAY,CAAC,KAAa,IAAG,CAAC;IAC9B,UAAU,CAAC,OAAe,EAAE,SAAiB,EAAE,IAAY,IAAG,CAAC;IAC/D,KAAK,CAAC,eAAe;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,CAAC,cAAc;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,KAAK,CAAC,cAAc,CAAC,UAAkB;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,IAAI,KAAI,CAAC;IACT,UAAU;QACR,OAAO,KAAK,CAAC;IACf,CAAC;IACD,aAAa,CAAC,KAAa,IAAG,CAAC;IAC/B,QAAQ,CAAC,MAAc,IAAG,CAAC;IAC3B,aAAa,CAAC,MAAc,IAAG,CAAC;IAChC,KAAK,CAAC,aAAa,KAAI,CAAC;IACxB,WAAW;QACT,OAAO,EAAE,MAAM,KAAI,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,eAAe,KAAI,CAAC;CACrB,CAAC","sourcesContent":["// No-op stub for non-Android platforms\nexport default {\n isAvailable(): boolean {\n return false;\n },\n addVoicePath(_path: string) {},\n setLicense(_userId: number, _password: number, _key: string) {},\n async initializeAsync(): Promise<boolean> {\n return false;\n },\n async getVoicesAsync() {\n return [];\n },\n async loadVoiceAsync(_voiceName: string): Promise<boolean> {\n return false;\n },\n async speakAsync(_text: string): Promise<number> {\n return -1;\n },\n stop() {},\n isSpeaking(): boolean {\n return false;\n },\n setSpeechRate(_rate: number) {},\n setPitch(_pitch: number) {},\n setAudioBoost(_boost: number) {},\n async shutdownAsync() {},\n addListener() {\n return { remove() {} };\n },\n removeListeners() {},\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@focus8/expo-acapela-tts",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Acapela TTS integration for Expo on Android",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -8,6 +8,7 @@ import {
8
8
  declare class ExpoAcapelaTtsModule extends NativeModule<ExpoAcapelaTtsModuleEvents> {
9
9
  isAvailable(): boolean;
10
10
  addVoicePath(path: string): void;
11
+ setLicense(userId: number, password: number, key: string): void;
11
12
  initializeAsync(): Promise<boolean>;
12
13
  getVoicesAsync(): Promise<AcapelaVoice[]>;
13
14
  loadVoiceAsync(voiceName: string): Promise<boolean>;
@@ -4,6 +4,7 @@ export default {
4
4
  return false;
5
5
  },
6
6
  addVoicePath(_path: string) {},
7
+ setLicense(_userId: number, _password: number, _key: string) {},
7
8
  async initializeAsync(): Promise<boolean> {
8
9
  return false;
9
10
  },