在 Android 中使用 Google Engine 进行文本转语音

2023-12-26

我正在 Android 中开发一个简单的应用程序,我在 TextToSpeech 方面遇到问题。

应用程序必须使用 TextToSpeech 来发音字母和数字,但有一个问题,默认情况下设备使用 PicoTTS 我希望他们被迫使用 google tts 引擎。

我怎样才能做到这一点?

My code:

@SuppressLint("NewApi")
public class LearnAlphabet extends Activity {
 Button howto, number, alphabet;
 public TextToSpeech tts;



 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.learn_number);

  ActionBar actionBar = getActionBar();
  actionBar.setDisplayShowTitleEnabled(true);
  actionBar.setDisplayHomeAsUpEnabled(true);
  actionBar.setHomeButtonEnabled(true);
  actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#0170a5")));

  GridView gridview = (GridView) findViewById(R.id.gridview);
  gridview.setAdapter(new NumberFunction(this));

  final String locale = getApplicationContext().getResources().getConfiguration().locale.getLanguage();



  tts = new TextToSpeech(getApplicationContext(), 
   new TextToSpeech.OnInitListener() {
    @Override
    public void onInit(int status) {
     if(status != TextToSpeech.ERROR){      

    switch (locale.toString()) {
     case "it":
      tts.setLanguage(new Locale("it_IT"));
     break;

     case "en":
      tts.setLanguage(new Locale("en_US")); 
     break;

     case "es":
      tts.setLanguage(new Locale("es_ES"));
     break;

     case "de":
      tts.setLanguage(new Locale("de_NL"));
     break;

     case "ru":
      tts.setLanguage(new Locale("ru_RU"));
     break;

     default:
      tts.setLanguage(new Locale("en_US"));  
     break;
    }    

     }              
    }
  }); 
 }

对于每个字母或数字:

  tts.speak(getResources().getString(R.string.a), TextToSpeech.QUEUE_FLUSH, null);

**** 编辑 ***** 如果我设置错误: tts.setEngineByPackageName(“com.google.android.tts”)

12-11 15:52:04.954: E/AndroidRuntime(12203): FATAL EXCEPTION: main
12-11 15:52:04.954: E/AndroidRuntime(12203): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.imparafacile/com.imparafacile.LearnAlphabet}: java.lang.NullPointerException
12-11 15:52:04.954: E/AndroidRuntime(12203):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2311)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at android.app.ActivityThread.access$600(ActivityThread.java:149)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1293)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at android.os.Looper.loop(Looper.java:137)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at android.app.ActivityThread.main(ActivityThread.java:5214)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at java.lang.reflect.Method.invokeNative(Native Method)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at java.lang.reflect.Method.invoke(Method.java:525)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at dalvik.system.NativeStart.main(Native Method)
12-11 15:52:04.954: E/AndroidRuntime(12203): Caused by: java.lang.NullPointerException
12-11 15:52:04.954: E/AndroidRuntime(12203):    at com.imparafacile.LearnAlphabet.onCreate(LearnAlphabet.java:47)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at android.app.Activity.performCreate(Activity.java:5133)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-11 15:52:04.954: E/AndroidRuntime(12203):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2225)

正在抛出 NPE,因为在调用 tts.setEngineByPackageName() 时 tts 对象为 null。

tts 将不会被创建,直到onInit()返回成功,因此您应该在中调用 tts.setEngineByPackageName()onInit():

String googleTtsPackage = "com.google.android.tts", picoPackage = "com.svox.pico";

tts = new TextToSpeech(getApplicationContext(), 
   new TextToSpeech.OnInitListener() {
    @Override
    public void onInit(int status) {
     if(status != TextToSpeech.ERROR){
    if(!isPackageInstalled(getPackageManager(), googleTtsPackage)) 
    confirmDialog();  
  else myTTS.setEngineByPackageName(googleTtsPackage); 
   } 


 private void confirmDialog(){
           AlertDialog.Builder d = new AlertDialog.Builder(LearnAlphabet.this);
           d.setTitle("Install recommeded speech engine?");
           d.setMessage("Your device isn't using the recommended speech engine. Do you wish to install it?");
        d.setPositiveButton("Yes", new android.content.DialogInterface.OnClickListener(){
           @Override
        public void onClick(DialogInterface dialog, int arg1){
              Intent installVoice = new Intent(Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(installVoice);
        }});
    d.setNegativeButton("No, later", new android.content.DialogInterface.OnClickListener(){
           @Override
        public void onClick(DialogInterface dialog, int arg1){
               if(isPackageInstalled(context.getPackageManager(), picoPackage))
                    myTTS.setEngineByPackageName(picoPackage);

           }
    });
    d.show();
    }
      public static boolean isPackageInstalled(PackageManager pm, String packageName) {
            try {
                pm.getPackageInfo(packageName, 0);
            } catch (NameNotFoundException e) {
                return false;
            }
            return true;
    }

如果您不希望重定向用户安装 google TTS 引擎(如果未安装),则可以删除confirmDialog()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 中使用 Google Engine 进行文本转语音 的相关文章

  • Android - 如何在运行时生成的 HTML 数据中加载外部 javascript 文件?

    我有一个包含 HTML 数据的 WebView 数据是在运行时生成的 我的应用程序的一个主要功能是突出显示该 HTML 数据的某些部分 我用 javascript 尝试过这个 Override public View onCreateVie
  • 当同级滚动到达末尾时打开底部工作表吗?

    有没有办法将滚动事件从一个滚动视图 转发 到我的底部工作表 以便当我过度滚动第一个滚动视图时我的底部工作表开始展开 考虑这个小应用程序 public class MainActivity extends AppCompatActivity
  • 如何在“onCreate”方法之后更改 Android SeekBar Thumb 可绘制对象?

    目前我正在尝试更改 android 中搜索栏 Thumb 的可绘制图像 在 onCreate 方法中 我可以使用以下命令有效地更改拇指 mSeekBar setThumb myDrawable 但是 在调用 onCreate 方法后 我尝试
  • 需要解释 android 布局语法

    这是布局文件中的一行
  • 如何获取PhoneGap将看到的android目录中的文档

    我希望能够将一些文件复制到我的 PhoneGap Cordova 的 Documents 目录中 以便当我使用 cordova plugin file API 列出该目录时它们会显示出来 不幸的是 文件 API 与平板电脑存储上的实际内容之
  • Firestore:发现名称 isText 的 getter 冲突

    我试图查看类似的问题 但它们对我来说没有用 我有一堂课 data class TextMessage val text String override val time Date override val senderId String o
  • 了解 UUID 的长形式和短形式

    我正在尝试学习一些android中的蓝牙编程我已经能够制作一个基本程序 该程序可以发现并连接到具有内置蓝牙功能的开发板 目前只有一个 我希望能够使用 RFCOMM 向开发板发送命令并接收消息有人告诉我 如果不知道主板和手机的 UUID 我可
  • Retrofit 2.0b2:如何从响应中获取InputStream?

    我正在使用 Retrofit 2 0b2 收到响应后 我尝试通过以下方式从响应中获取 InputStream Response
  • 一段时间后完成活动

    我正在尝试开发一个类似匹配小图片的游戏 我的问题是我想在一段时间后完成游戏 例如 在第 1 级中 我们有 10 秒的时间来匹配图片 我也想显示剩余时间 如果有任何帮助 我将不胜感激 既然你还想显示倒计时 我会推荐一个倒计时器 http de
  • ScrollView 截掉顶部并在底部留出空间

    当我启动模拟器并进入使用此代码的屏幕时 它显示了大部分文本信息 但切断了屏幕顶部 无法向上滚动 但在底部留下了一些空间 这是代码
  • 如何在不进行列表搜索的情况下知道是否喜欢该帖子

    我尝试使用 fql 查询来获取 json 响应 我使用此代码来执行此操作 String postid jsonObject getString id String query SELECT likes user likes FROM str
  • 查找附近应用程序的用户(iPhone 和 Android)

    我正在开发一个有 iPhone 版本和 Android 版本的应用程序 我的目标是 显示我的应用程序的附近用户列表 iPhone 应用程序用户和 Android 应用程序用户 假设列出当前在 1 英里或 2 英里半径内并且当前正在使用我的应
  • 如何向通话记录数据库添加新字段和记录?

    我正在尝试制作 VoIP 应用程序 我想知道是否可以通过呼叫日志内容提供商执行以下操作 我想为 VoIP 呼叫添加新的呼叫日志记录以及常规呼叫的呼叫日志 如何向现有通话记录内容提供商添加新记录 我想将自定义字段添加到呼叫日志中 例如会话 I
  • 如何让按钮打开

    我有一个问题 当用户单击 发送 按钮时 我需要将电子邮件发送到我的按钮 我只想到达那里 当用户单击发送按钮时 该按钮已经知道我的电子邮件地址并自动将其发送到那里的电子邮件 到目前为止 我的电子邮件活动 java import android
  • Android 启动器在启动器中按 Home 键转到默认屏幕

    在默认的 Android 启动器中 在另一个 Activity 中按 Home 键将启动启动器 在启动器中再次按主页将重置为默认主屏幕页面 我不明白这是怎么做到的 无论启动器是否在前台 Android 都会发送相同的意图 Home 键也无法
  • 列表视图标题和第一项之间的空白

    我创建了一个带有 ListView 的 Android 应用程序 我已将页眉和页脚添加到列表中 但是 当添加分隔符 分隔符时 它还会在标题和第一个 ListView 项之间创建一个空白空间 它对最后一个 ListView 项目和页脚执行相同
  • 如何在 android 相对布局周围放置边框?

    我见过这个subject https stackoverflow com questions 3182723 android draw custom border around listview关于在 android textview 周围
  • getView 中的位置索引始终返回 0

    我想实现一个 ListView 其中每行内都有删除按钮 我唯一的问题是 当我单击某些行的 删除 Btn 时 位置 0 的行刚刚被删除 我认为 getView 中的 Position 参数无法更新并且始终为 0 值 我应该怎么办 Thanks
  • java.lang.IllegalStateException Butterknife

    我面临着java lang IllegalStateException Required view splash text 但我已将其包含在 xml 中 我在用Butterknife绑定视图 compile com jakewharton
  • Android 中自定义对话框内的日期选择器

    我想在自定义对话框中使用日期选择器 单击按钮上的日历将打开以供用户选择日期 我的 customDilaog 类中有 Button 在该按钮上单击 我想打开日历视图 如果单击此按钮 我的应用程序将崩溃 我已经完成了这个 CustomDialo

随机推荐

  • 错误:包路径 ./compat 未从包中导出

    Note 我想我能够重现这个 参见堆栈闪电战示例 https stackblitz com edit angular fire start np32w7 file app 2Fapp component ts 错误在控制台中打印为 INTE
  • 如何在 SSIS 中的执行 SQL 任务中使用参数映射?

    我正在尝试检索的值Key通过 SSIS 中的简单 select 语句从表中获取Execute SQL Task 但没有运气找出这个错误 我使用了一个字符串数据类型的输入变量 并在参数映射中使用了该变量Execute SQL Task 执行查
  • 具有墓碑的哈希表的负载因子

    那么问题来了 在计算哈希表的负载因子时是否应该包括墓碑 我认为 考虑到负载系数是用来确定何时扩展容量的 所以不应该包括墓碑 一个明显的例子是 如果您几乎填充然后删除哈希表中的每个值 这里的插入非常容易 没有碰撞 所以我相信负载因子不应该包括
  • laravel phpunit 测试与 api 令牌身份验证

    如何在 phpunit 中添加授权标头 我正在测试需要 api token 的 json api laravel 文档提供了actingAs 方法 但这在我的情况下不起作用 因为 api 令牌与用户表不直接相关 EDIT public fu
  • 无法从 Objective-C 视图控制器访问 Swift var - iOS

    我有一个带有 Objective C 和基于 Swift 的视图控制器的应用程序 我正在以编程方式从我的一个基于 Objective C 的视图控制器之一打开一个基于 Swift 的视图控制器 我遇到的问题是我无法从 Objective C
  • 返回带有准备好的语句的时间戳

    我有一个自动生成的时间戳 每次在 mysql 表中插入或更新记录时都会创建该时间戳 有没有办法以类似于我使用密钥持有者返回新创建的 id 的方式返回此时间戳 KeyHolder keyHolder new GeneratedKeyHolde
  • Liferay集群[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您知道有关在 Glassfish 中安装 Liferay 集群的分步教程吗 谷歌给我找到了这篇文章 名为
  • Android布局动画在ImageView上从下到上和从上到下单击

    我在 Android 中创建了一个视图 我需要从下到上对其进行动画处理 反之亦然 当我点击ImageView我需要制作完整的动画RelativeLayout从下到上 就成功了 但是当我再次点击ImageView而且它并没有向下移动 另外 当
  • Morris.js 条形图未渲染悬停在文本上

    我正在使用 Morris js 条形图 由于某种原因 本应出现在 HOVER OVER 上的数字列在左下角 有人知道为什么吗 如果没有任何代码 很难给出一个好的答案 但是 它可能与您的 CSS 文件有关 莫里斯用它来放置胡佛 CSS mor
  • 我如何增加 inputAccessoryView 的高度

    我在这个问题上花了几天时间 但没有看到解决方案 我有一个inputAccessoryView其中包括一个UIView含有一个textView和两个按钮 的行为inputAccessoryView符合预期 并且在除一种情况外的所有情况下都工作
  • 打开 .exe 并通过 Python 子进程向其传递命令?

    所以我的 exe 程序已打开 但我想从 python 脚本将字符串传递给它 我像这样打开exe import subprocess p subprocess Popen E Work my exe shell True let user f
  • Android:无法让 YouTube Player API 在片段内工作

    我正在尝试让我的应用程序在片段中播放 YouTube 视频 如下所示本官方文档 https developers google com youtube android player reference com google android
  • 如何使用 jQuery 检查文本字段值与数组中的单词?

    我的数组有字符串值 var bannedWords cat dog test 我的文本输入字段检查该值是否包含数组中的单词 var title j edit content val if j inArray title bannedWord
  • 返回层次结构中第 N 级的类别名称(parentId -1 的类别位于第 1 级)

    数据样本 WITH sample data AS SELECT CategoryId ParentCategoryId Name Keywords FROM VALUES 100 1 business Money 200 1 tutorin
  • 托管目标代码需要“\clr”选项:错误

    当我尝试批量构建项目时 在启用 clr 运行时支持时遇到此错误 我的项目可以毫无问题地运行 并且只有当我尝试进行批量构建时才会收到此错误 我在 google 中进行了大量搜索 但大多数结果都是关于启用 clr 选项 我想知道如何解决这个问题
  • 在 ASP.NET MVC5 中绑定 @Html.DropDownListFor 的最佳方法是什么?

    我要绑定 Html DropDownListFor from Model不使用数据Viewbag并查看网络上的许多不同示例 但大部分都用Viewbag或扩展方法 我想要一个更好的方法来解决这个问题 我尝试了以下方法 但似乎不起作用 Html
  • Linspace 与 Range

    我想知道什么是更好的风格 更高效 x linspace 1 1 100 or x 1 0 01 1 正如奥利 查尔斯沃斯提到的 linspace你划分区间 a b into N点 而与 形式 你走出a以指定的步长 默认 1 直到达到b 要记
  • 防止 Javascript 和 XSS 攻击

    我正在对我的网站进行 xss 防护 防止 javascript 和 xss 攻击 它是用 ASP NET Webforms 编写的 我想测试的主要部分是一个具有文本框 附加有tinyMCE 的用户控件 用户可以通过在此文本框中写入内容来将故
  • 为什么我在 macOS 上收到“没有此类文件或目录”错误?

    使用以下代码 fileName Data all earthquakes csv with open fileName rb as csv file attrHeaderRow csv file readline strip 我收到以下错误
  • 在 Android 中使用 Google Engine 进行文本转语音

    我正在 Android 中开发一个简单的应用程序 我在 TextToSpeech 方面遇到问题 应用程序必须使用 TextToSpeech 来发音字母和数字 但有一个问题 默认情况下设备使用 PicoTTS 我希望他们被迫使用 google