Android 语音播报之项目实战

34 篇文章 0 订阅
14 篇文章 0 订阅

文字转语音

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

官网简介

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

项目前景

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

在这里插入图片描述

项目实战

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

在这里插入图片描述
       当初在遇到语音播报的时候,不知道应用哪个好,开发周期比较紧张,所以引用了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 4、7小米平板真机调试,系统不支持中文播放

结尾

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

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

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拉莫帅

你的鼓励将是我的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值