Android 语音播报之项目实战

TextToSpeech项目应用

  • 文字转语音
  • 官网简介
  • 项目前景
    • 项目实战
    • 真机调试
    • 结尾

文字转语音

       从文本合成语音以立即播放或创建声音文件。即TextToSpeech(以下简称TTS)
       TTS是语音合成应用的一种,它将储存于电脑中的文件,如帮助文件或者网页,转换成自然语音输出。
       TTS不仅能帮助有视觉障碍的人阅读计算机上的信息,更能增加文本文档的可读性。现在的TTS应用包括语音驱动的邮件以及声音敏感系统,并常与声音识别程序一起使用。TextToSpeech必须再被实例化之后才能使用.实现TextToSpeech.OnInitListener方法来获取实例化结果的提醒。当你已经使用完TextToSpeech实例之后, 应该调用shutdown()方法来释放TextToSpeech所使用的本地资源。

官网简介

具体详情可以去参考   链接地址:TextToSpeech

Android 语音播报之项目实战_第1张图片
Android 语音播报之项目实战_第2张图片
Android 语音播报之项目实战_第3张图片
Android 语音播报之项目实战_第4张图片
Android 语音播报之项目实战_第5张图片
Android 语音播报之项目实战_第6张图片

项目前景

       最近在项目应用到了语音播报功能。由于近期业务中,物联网蓝牙连接设备过程中,光有toast,客户感觉无感操作,故新增了语音播报功能。
       语音播报功能应用场景也很多的,所以我们从其中找符合自己的就可。

Android 语音播报之项目实战_第7张图片

项目实战

在这里我单独拉出来一个项目,供各位老板参考一下,共同学习!

Android 语音播报之项目实战_第8张图片
       当初在遇到语音播报的时候,不知道应用哪个好,开发周期比较紧张,所以引用了TextToSpeech,研发简单、简便。
       在研发过程中,遇到一个问题,第一次运行,语音播报正常。等活动页运行销毁后,第二次调起语音播报异常,无法播报的情况,这个问题已解决。

具体代码如下:

/**
 * @author 拉莫帅
 * @date 2022/8/15
 * @address
 * @Desc 语音播报监听开始、结束
 */
public interface SpeakListener {
    void startSpeak(String text);

    void stopSpeak();
}
/**
 * @author 拉莫帅
 * @date 2022/8/15
 * @address
 * @Desc 语音播报工具类
 */
public class SpeechUtils extends UtteranceProgressListener implements SpeakListener, TextToSpeech.OnUtteranceCompletedListener{
    private Context mContext;
    private static SpeechUtils singleton;
    private TextToSpeech mTextToSpeech; // 系统语音播报类
    private boolean isSuccess = true;

    /**
     * 单例模式
     * @param context
     * @return
     */
    public static SpeechUtils getInstance(Context context) {
        if (singleton == null) {
            synchronized (SpeechUtils.class) {
                if (singleton == null) {
                    singleton = new SpeechUtils(context);
                }
            }
        }
        return singleton;
    }

    private SpeechUtils(Context context) {
        this.mContext = context.getApplicationContext();
        mTextToSpeech = new TextToSpeech(mContext, new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int i) {
                //系统语音初始化成功
                if (i == TextToSpeech.SUCCESS) {//操作成功
                    int result = mTextToSpeech.setLanguage(Locale.CHINA);
                    mTextToSpeech.setPitch(1.0f);// 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
                    mTextToSpeech.setSpeechRate(1.0f);
                    mTextToSpeech.setOnUtteranceProgressListener(SpeechUtils.this);
                    mTextToSpeech.setOnUtteranceCompletedListener(SpeechUtils.this);

                    // TextToSpeech.LANG_MISSING_DATA:表示语言的数据丢失
                    // TextToSpeech.LANG_NOT_SUPPORTED:不支持
                    if (result == TextToSpeech.LANG_MISSING_DATA
                            || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                        //系统不支持中文播报
                        isSuccess = false;
                    }
                }

            }
        });
    }

    /**
     * 开始播报
     * @param text
     */
    @SuppressLint("NewApi")
    @Override
    public void startSpeak(String text) {
        if (!isSuccess) {
            Toast.makeText(mContext, "系统不支持中文播报", Toast.LENGTH_SHORT).show();
            return;
        }

        if (mTextToSpeech != null) {
            // QUEUE_ADD:该模式下会把新的语音任务放到语音任务之后,等前面的语音任务执行完了才会执行新的语音任务。
            // QUEUE_FLUSH:该模式下在有新任务时候会清除当前语音任务,执行新的语音任务
            mTextToSpeech.speak(text,
                    TextToSpeech.QUEUE_ADD, null, null);
        }
    }

    /**
     * 结束播报
     */
    @Override
    public void stopSpeak() {
        if (mTextToSpeech != null) {
            mTextToSpeech.stop();
        }
    }

    /**
     * 语音播报完成回调
     * @param utteranceId
     */
    @Override
    public void onUtteranceCompleted(String utteranceId) {

    }

    @Override
    public void onStart(String utteranceId) {

    }

    @Override
    public void onDone(String utteranceId) {

    }

    @Override
    public void onError(String utteranceId) {

    }
}
/**
 * @author 拉莫帅
 * @date 2022/8/15
 * @address
 * @Desc 主功能(TTS)
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private SpeechUtils speechUtils;
    private EditText editText;
    private ImageView speakButton;

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

        initView();
    }

    /**
     * 初始化控件
     */
    private void initView() {
        speechUtils = SpeechUtils.getInstance(MainActivity.this);
        editText = findViewById(R.id.editText);
        speakButton = findViewById(R.id.btn);
        speakButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn:
                String speakText = editText.getText().toString().trim();
                boolean empty = StrUtils.isEmpty(speakText);

                if (empty) {
                    //执行播报
                    speechUtils.startSpeak("请您输入要播报的内容");
                    Toast.makeText(MainActivity.this, "请您输入要播报的内容", Toast.LENGTH_SHORT).show();
                    return;
                } else {
                    speechUtils.startSpeak(speakText);
                    Toast.makeText(MainActivity.this, speakText, Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

    /**
     * 销毁
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();

        //结束播报
        speechUtils.stopSpeak();
    }
}

真机调试

语音播报,本人应用多版本真机进行了测试,目前没有发现什么问题,欢迎大家来补充!
真机分别:红米手机、华为手机、华为平板、华为鸿蒙系统手机、vivo手机,以上机型实测有效。

真机版本如下:
Android 语音播报之项目实战_第9张图片Android 语音播报之项目实战_第10张图片Android 语音播报之项目实战_第11张图片


Android 语音播报之项目实战_第12张图片Android 语音播报之项目实战_第13张图片Android 语音播报之项目实战_第14张图片

今天拿朋友的Android 4、7小米平板真机调试,系统不支持中文播放

Android 语音播报之项目实战_第15张图片 Android 语音播报之项目实战_第16张图片

结尾

欢迎各位老板光临寒舍,共同学习,留言探讨!

项目地址:Android 语音播报功能之项目实战

Android 语音播报之项目实战_第17张图片

你可能感兴趣的:(程序人生,开发技巧,Android,android,语音识别,人工智能)