eSpeak NG is an open source speech synthesizer that supports more than hundred languages and accents.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

VoiceVariantPreference.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. /*
  2. * Copyright (C) 2013 Reece H. Dunn
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.reecedunn.espeak.preference;
  17. import android.app.Activity;
  18. import android.content.Context;
  19. import android.content.DialogInterface;
  20. import android.content.SharedPreferences;
  21. import android.preference.DialogPreference;
  22. import android.util.AttributeSet;
  23. import android.view.LayoutInflater;
  24. import android.view.View;
  25. import android.view.ViewGroup;
  26. import android.widget.AdapterView;
  27. import android.widget.ArrayAdapter;
  28. import android.widget.Spinner;
  29. import android.widget.TextView;
  30. import com.reecedunn.espeak.R;
  31. import com.reecedunn.espeak.ResourceIdListAdapter;
  32. import com.reecedunn.espeak.VoiceSettings;
  33. import com.reecedunn.espeak.VoiceVariant;
  34. public class VoiceVariantPreference extends DialogPreference {
  35. private Spinner mCategory;
  36. private Spinner mVariant;
  37. private int mCategoryIndex = 0;
  38. private int mVariantIndex = 0;
  39. static class ViewHolder
  40. {
  41. public TextView text;
  42. }
  43. private class VariantData {
  44. private final int name;
  45. private final Object arg;
  46. private final VoiceVariant variant;
  47. protected VariantData(int name, String variant) {
  48. this(name, null, variant);
  49. }
  50. protected VariantData(int name, Object arg, String variant) {
  51. this.name = name;
  52. this.arg = arg;
  53. this.variant = VoiceVariant.parseVoiceVariant(variant);
  54. }
  55. public String getDisplayName(Context context) {
  56. String text = context.getText(name).toString();
  57. if (arg == null) {
  58. return text;
  59. }
  60. return String.format(text, arg);
  61. }
  62. public VoiceVariant getVariant() {
  63. return variant;
  64. }
  65. }
  66. public class VariantDataListAdapter extends ArrayAdapter<VariantData>
  67. {
  68. private final LayoutInflater mInflater;
  69. public VariantDataListAdapter(Activity context, VariantData[] resources)
  70. {
  71. super(context, android.R.layout.simple_list_item_1, resources);
  72. mInflater = context.getLayoutInflater();
  73. }
  74. @Override
  75. public View getView(int position, View convertView, ViewGroup parent)
  76. {
  77. ViewHolder holder;
  78. if (convertView == null)
  79. {
  80. convertView = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
  81. holder = new ViewHolder();
  82. holder.text = (TextView)convertView.findViewById(android.R.id.text1);
  83. convertView.setTag(holder);
  84. }
  85. else
  86. {
  87. holder = (ViewHolder)convertView.getTag();
  88. }
  89. holder.text.setText(getItem(position).getDisplayName(getContext()));
  90. return convertView;
  91. }
  92. @Override
  93. public View getDropDownView(int position, View convertView, ViewGroup parent)
  94. {
  95. return getView(position, convertView, parent);
  96. }
  97. }
  98. private Integer[] categories = {
  99. R.string.variant_male,
  100. R.string.variant_female,
  101. R.string.variant_klatt,
  102. R.string.variant_nvda,
  103. R.string.variant_young,
  104. R.string.variant_old,
  105. R.string.variant_croak,
  106. R.string.variant_whisper,
  107. };
  108. private VariantData[][] variants = {
  109. { // Male
  110. new VariantData(R.string.variant_default, "male"),
  111. new VariantData(R.string.variant_n, 1, "m1"),
  112. new VariantData(R.string.variant_n, 2, "m2"),
  113. new VariantData(R.string.variant_n, 3, "m3"),
  114. new VariantData(R.string.variant_n, 4, "m4"),
  115. new VariantData(R.string.variant_n, 5, "m5"),
  116. new VariantData(R.string.variant_n, 6, "m6"),
  117. new VariantData(R.string.variant_n, 7, "m7"),
  118. new VariantData(R.string.variant_n, 8, "m8"),
  119. },{ // Female
  120. new VariantData(R.string.variant_default, "female"),
  121. new VariantData(R.string.variant_n, 1, "f1"),
  122. new VariantData(R.string.variant_n, 2, "f2"),
  123. new VariantData(R.string.variant_n, 3, "f3"),
  124. new VariantData(R.string.variant_n, 4, "f4"),
  125. new VariantData(R.string.variant_n, 5, "f5"),
  126. },{ // Klatt
  127. new VariantData(R.string.variant_n, 1, "klatt"),
  128. new VariantData(R.string.variant_n, 2, "klatt2"),
  129. new VariantData(R.string.variant_n, 3, "klatt3"),
  130. new VariantData(R.string.variant_n, 4, "klatt4"),
  131. new VariantData(R.string.variant_n, 5, "klatt5"),
  132. new VariantData(R.string.variant_n, 6, "klatt6"),
  133. },{ // NVDA
  134. new VariantData(R.string.variant_adam, "adam"),
  135. new VariantData(R.string.variant_alex, "Alex"),
  136. new VariantData(R.string.variant_alicia, "Alicia"),
  137. new VariantData(R.string.variant_andy, "Andy"),
  138. new VariantData(R.string.variant_andrea, "Andrea"),
  139. new VariantData(R.string.variant_anika, "anika"),
  140. new VariantData(R.string.variant_anika_robot, "anikaRobot"),
  141. new VariantData(R.string.variant_annie, "Annie"),
  142. new VariantData(R.string.variant_anouncer, "anouncer"),
  143. new VariantData(R.string.variant_antonio, "antonio"),
  144. new VariantData(R.string.variant_anxious_andy, "AnxiousAndy"),
  145. new VariantData(R.string.variant_aunty, "aunty"),
  146. new VariantData(R.string.variant_belinda, "belinda"),
  147. new VariantData(R.string.variant_benjamin, "benjamin"),
  148. new VariantData(R.string.variant_boris, "boris"),
  149. new VariantData(R.string.variant_caleb, "caleb"),
  150. new VariantData(R.string.variant_david, "david"),
  151. new VariantData(R.string.variant_demonic, "Demonic"),
  152. new VariantData(R.string.variant_denis, "Denis"),
  153. new VariantData(R.string.variant_diogo, "Diogo"),
  154. new VariantData(R.string.variant_ed, "ed"),
  155. new VariantData(R.string.variant_edward, "edward"),
  156. new VariantData(R.string.variant_edward2, "edward2"),
  157. new VariantData(R.string.variant_gene, "Gene"),
  158. new VariantData(R.string.variant_gene2, "Gene2"),
  159. new VariantData(R.string.variant_grandma, "grandma"),
  160. new VariantData(R.string.variant_grandpa, "grandpa"),
  161. new VariantData(R.string.variant_gustave, "gustave"),
  162. new VariantData(R.string.variant_henrique, "Henrique"),
  163. new VariantData(R.string.variant_hugo, "Hugo"),
  164. new VariantData(R.string.variant_iven, "iven"),
  165. new VariantData(R.string.variant_iven2, "iven2"),
  166. new VariantData(R.string.variant_iven3, "iven3"),
  167. new VariantData(R.string.variant_jacky, "Jacky"),
  168. new VariantData(R.string.variant_john, "john"),
  169. new VariantData(R.string.variant_kaukovalta, "kaukovalta"),
  170. new VariantData(R.string.variant_lee, "Lee"),
  171. new VariantData(R.string.variant_linda, "linda"),
  172. new VariantData(R.string.variant_marcelo, "Marcelo"),
  173. new VariantData(R.string.variant_marco, "Marco"),
  174. new VariantData(R.string.variant_mario, "Mario"),
  175. new VariantData(R.string.variant_max, "max"),
  176. new VariantData(R.string.variant_miguel, "miguel"),
  177. new VariantData(R.string.variant_michael, "Michael"),
  178. new VariantData(R.string.variant_michel, "michel"),
  179. new VariantData(R.string.variant_mike, "Mike"),
  180. new VariantData(R.string.variant_mr_serious, "Mr serious"),
  181. new VariantData(R.string.variant_nguyen, "Nguyen"),
  182. new VariantData(R.string.variant_norbert, "norbert"),
  183. new VariantData(R.string.variant_pablo, "pablo"),
  184. new VariantData(R.string.variant_paul, "paul"),
  185. new VariantData(R.string.variant_pedro, "pedro"),
  186. new VariantData(R.string.variant_quincy, "quincy"),
  187. new VariantData(R.string.variant_ricishay_max, "RicishayMax"),
  188. new VariantData(R.string.variant_ricishay_max2, "RicishayMax2"),
  189. new VariantData(R.string.variant_ricishay_max3, "RicishayMax3"),
  190. new VariantData(R.string.variant_rob, "rob"),
  191. new VariantData(R.string.variant_robert, "robert"),
  192. new VariantData(R.string.variant_robosoft, "robosoft"),
  193. new VariantData(R.string.variant_robosoft2, "robosoft2"),
  194. new VariantData(R.string.variant_robosoft3, "robosoft3"),
  195. new VariantData(R.string.variant_robosoft4, "robosoft4"),
  196. new VariantData(R.string.variant_robosoft3, "robosoft3"),
  197. new VariantData(R.string.variant_robosoft4, "robosoft4"),
  198. new VariantData(R.string.variant_robosoft5, "robosoft5"),
  199. new VariantData(R.string.variant_robosoft6, "robosoft6"),
  200. new VariantData(R.string.variant_robosoft7, "robosoft7"),
  201. new VariantData(R.string.variant_robosoft8, "robosoft8"),
  202. new VariantData(R.string.variant_sandro, "sandro"),
  203. new VariantData(R.string.variant_shelby, "shelby"),
  204. new VariantData(R.string.variant_storm, "Storm"),
  205. new VariantData(R.string.variant_travis, "travis"),
  206. new VariantData(R.string.variant_tweaky, "Tweaky"),
  207. new VariantData(R.string.variant_unirobot, "UniRobot"),
  208. new VariantData(R.string.variant_victor, "victor"),
  209. new VariantData(R.string.variant_zac, "zac"),
  210. },{ // Young
  211. new VariantData(R.string.variant_male, "male-young"),
  212. new VariantData(R.string.variant_female, "female-young"),
  213. },{ // Old
  214. new VariantData(R.string.variant_male, "male-old"),
  215. new VariantData(R.string.variant_female, "female-old"),
  216. },{ // Croak
  217. new VariantData(R.string.variant_male, "croak"),
  218. },{ // Whisper
  219. new VariantData(R.string.variant_male, "whisper"),
  220. new VariantData(R.string.variant_female, "whisperf"),
  221. },
  222. };
  223. public VoiceVariantPreference(Context context, AttributeSet attrs, int defStyle) {
  224. super(context, attrs, defStyle);
  225. setDialogLayoutResource(R.layout.voice_variant_preference);
  226. setLayoutResource(R.layout.information_view);
  227. setPositiveButtonText(android.R.string.ok);
  228. setNegativeButtonText(android.R.string.cancel);
  229. }
  230. public VoiceVariantPreference(Context context, AttributeSet attrs) {
  231. this(context, attrs, 0);
  232. }
  233. public VoiceVariantPreference(Context context) {
  234. this(context, null);
  235. }
  236. public void setVoiceVariant(VoiceVariant variant) {
  237. for (int i = 0; i < variants.length; ++i) {
  238. VariantData[] items = variants[i];
  239. for (int j = 0; j < items.length; ++j) {
  240. if (items[j].getVariant().equals(variant)) {
  241. mCategoryIndex = i;
  242. mVariantIndex = j;
  243. onDataChanged();
  244. return;
  245. }
  246. }
  247. }
  248. onDataChanged();
  249. }
  250. @Override
  251. protected View onCreateDialogView() {
  252. View root = super.onCreateDialogView();
  253. mCategory = (Spinner)root.findViewById(R.id.category);
  254. mVariant = (Spinner)root.findViewById(R.id.variant);
  255. return root;
  256. }
  257. @Override
  258. protected void onBindDialogView(View view) {
  259. super.onBindDialogView(view);
  260. // Cache the indices so they don't get overwritten by the OnItemSelectedListener handlers.
  261. final int category = mCategoryIndex;
  262. final int variant = mVariantIndex;
  263. mCategory.setAdapter(new ResourceIdListAdapter((Activity)getContext(), categories));
  264. mCategory.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  265. private boolean mInitializing = true;
  266. @Override
  267. public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
  268. mVariant.setAdapter(new VariantDataListAdapter((Activity) getContext(), variants[position]));
  269. if (mInitializing) {
  270. mVariant.setSelection(variant);
  271. mInitializing = false;
  272. }
  273. mCategoryIndex = position;
  274. }
  275. @Override
  276. public void onNothingSelected(AdapterView<?> adapterView) {
  277. }
  278. });
  279. mVariant.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  280. @Override
  281. public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
  282. mVariantIndex = position;
  283. }
  284. @Override
  285. public void onNothingSelected(AdapterView<?> adapterView) {
  286. }
  287. });
  288. mCategory.setSelection(category);
  289. }
  290. @Override
  291. public void onClick(DialogInterface dialog, int which) {
  292. switch (which) {
  293. case DialogInterface.BUTTON_POSITIVE:
  294. onDataChanged();
  295. if (shouldCommit()) {
  296. SharedPreferences.Editor editor = getEditor();
  297. if (editor != null) {
  298. VoiceVariant variant = variants[mCategoryIndex][mVariantIndex].getVariant();
  299. editor.putString(VoiceSettings.PREF_VARIANT, variant.toString());
  300. editor.commit();
  301. }
  302. }
  303. break;
  304. }
  305. super.onClick(dialog, which);
  306. }
  307. private void onDataChanged() {
  308. Context context = getContext();
  309. CharSequence category = context.getText(categories[mCategoryIndex]);
  310. CharSequence variant = variants[mCategoryIndex][mVariantIndex].getDisplayName(context);
  311. callChangeListener(String.format("%s (%s)", category, variant));
  312. }
  313. }