Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Android语音到文本::实时更新文本

Android语音到文本::实时更新文本
EN

Stack Overflow用户
提问于 2016-05-29 03:19:50
回答 1查看 2.6K关注 0票数 5

我想在我的应用程序中把语音转换成文字。为此,我正在使用recognitionListener界面,一切都很好,但是如何更新和显示文本,甚至在说话时也是如此(就像google语音搜索一样)

我已将RecognizerIntent.EXTRA_PARTIAL_RESULTS设置为true,并使用recognitionListener接口的onPartialResults(Bundle arg()方法)设置文本,在语音识别完成后立即显示整个文本,但我希望在用户说话时实时显示文本。

我的活动

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends Activity implements RecognitionListener
{
private TextView returnedText;
private ToggleButton toggleButton;
private ProgressBar progressBar;
private SpeechRecognizer speech = null;
private Intent recognizerIntent;
private String LOG_TAG = "VoiceRecognitionActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    returnedText = (TextView) findViewById(R.id.textView1);
    progressBar = (ProgressBar) findViewById(R.id.progressBar1);
    toggleButton = (ToggleButton) findViewById(R.id.toggleButton1);
    Button recordbtn = (Button) findViewById(R.id.mainButton);


    progressBar.setVisibility(View.INVISIBLE);
    speech = SpeechRecognizer.createSpeechRecognizer(this);
    speech.setRecognitionListener(this);
    recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE,
                              "en");
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
                              this.getPackageName());
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                              RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true);
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 3000);

    toggleButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                                         boolean isChecked) {
                if (isChecked) {
                    progressBar.setVisibility(View.VISIBLE);
                    progressBar.setIndeterminate(true);
                    speech.startListening(recognizerIntent);
                } else {
                    progressBar.setIndeterminate(false);
                    progressBar.setVisibility(View.INVISIBLE);
                    speech.stopListening();
                }
            }
        });


    recordbtn.setOnLongClickListener(new OnLongClickListener(){

            @Override
            public boolean onLongClick(View p1)
            {
                progressBar.setVisibility(View.VISIBLE);
                progressBar.setIndeterminate(true);
                speech.startListening(recognizerIntent);
                return true;
            }


        });



}

@Override
public void onResume() {
    super.onResume();
}

@Override
protected void onPause() {
    super.onPause();
    if (speech != null) {
        speech.destroy();
        Log.i(LOG_TAG, "destroy");
    }

}

@Override
public void onBeginningOfSpeech() {
    Log.i(LOG_TAG, "onBeginningOfSpeech");
    progressBar.setIndeterminate(false);
    progressBar.setMax(10);
}

@Override
public void onBufferReceived(byte[] buffer) {
    Log.i(LOG_TAG, "onBufferReceived: " + buffer);
}

@Override
public void onEndOfSpeech() {
    Log.i(LOG_TAG, "onEndOfSpeech");
    progressBar.setIndeterminate(true);
    toggleButton.setChecked(false);
}

@Override
public void onError(int errorCode) {
    String errorMessage = getErrorText(errorCode);
    Log.d(LOG_TAG, "FAILED " + errorMessage);
    returnedText.setText(errorMessage);
    toggleButton.setChecked(false);
}

@Override
public void onEvent(int arg0, Bundle arg1) {
    Log.i(LOG_TAG, "onEvent");
}

@Override
public void onPartialResults(Bundle arg0) {
    Log.i(LOG_TAG, "onPartialResults");

    ArrayList<String> matches = arg0.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
    String text = "";
    for (String result : matches)
        text += result + "\n";

    returnedText.setText(text);
}

@Override
public void onReadyForSpeech(Bundle arg0) {
    Log.i(LOG_TAG, "onReadyForSpeech");
}

@Override
public void onResults(Bundle results) {
    Log.i(LOG_TAG, "onResults");

}

@Override
public void onRmsChanged(float rmsdB) {
    Log.i(LOG_TAG, "onRmsChanged: " + rmsdB);
    progressBar.setProgress((int) rmsdB);

}

public static String getErrorText(int errorCode) {
    String message;
    switch (errorCode) {
        case SpeechRecognizer.ERROR_AUDIO:
            message = "Audio recording error";
            break;
        case SpeechRecognizer.ERROR_CLIENT:
            message = "Client side error";
            break;
        case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
            message = "Insufficient permissions";
            break;
        case SpeechRecognizer.ERROR_NETWORK:
            message = "Network error";
            break;
        case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
            message = "Network timeout";
            break;
        case SpeechRecognizer.ERROR_NO_MATCH:
            message = "No match";
            break;
        case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
            message = "RecognitionService busy";
            break;
        case SpeechRecognizer.ERROR_SERVER:
            message = "error from server";
            break;
        case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
            message = "No speech input";
            break;
        default:
            message = "Didn't understand, please try again.";
            break;
    }
    return message;
}

}

如何做到这一点,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-30 01:35:34

使用google无法实现实时识别。在最好的情况下,当您使用OK google或例如在Whatsup中逐字书写文本时,您可以获得与Google相同的结果,添加到您的意图中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
recognizerIntent.putExtra("android.speech.extra.DICTATION_MODE", true);

语音识别器采取他的时间来处理所有的信息,并将其分割为信息,以便能够在您的应用程序中使用。您可以查看下一篇文章,看看它是否有助于优化您的应用程序:Make SpeechRecognizer Faster

希望它能帮助你!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37509257

复制
相关文章
MySQL信号量等待日志阅读
lock_word的初始值为X_LOCK_DECR,每次添加x锁时原子递减X_LOCK_DECR,每次添加S锁时原子递减1。每次添加SX锁时递减X_LOCK_HALF_DECR。如果读写锁支持递归写,那么第一个递归写锁加锁成功时,lock_word 依然原子递减X_LOCK_DECR,而后续的递归写锁加锁成功是,lock_word 只是原子递减1。
donghy
2022/09/17
1.1K0
有界数组模板类(类模板)
编写有界数组模板BoundArray(即检查对数组元素下标引用并在下标越界时终止程序的执行),能够存储各种类型的数据。要求实现对数组进行排序的方法sort,及对数组进行查找的方法search。(不能直接调用C++自带的排序或查找函数)
叶茂林
2023/07/30
1620
做网站收益如何?能满足生活保障吗?
看到前两天有一位网友在泪雪博客留言问到子凡我做网站收益如何?能满足生活保障吗?仔细一想好像这个问题应该是所有做网站的人都会思考的一个问题,那么下面子凡就根据自己的亲身经历和感受来回答一下这个问题,顺便整理成文发布出来。
张子凡
2022/11/02
1.3K0
做网站收益如何?能满足生活保障吗?
现在的工程结构能满足你的需求吗?
创建单模块工程相信很多人都手到擒来。但如果项目很大,功能很多,你还能继续使用单模块工程吗?项目过大,结构肯定也越来越复杂这时候如果你继续使用单模块工程,进展就会遇到各种问题。同时维护起来也是很麻烦的事情。这个时候你就可以考虑将功能细化,使用多模块工程来替代单模块了。
田维常
2019/09/12
9950
现在的工程结构能满足你的需求吗?
SaaS企业要满足客户的定制开发需求吗?
本文作者 吴昊:腾讯SaaS加速器导师、纷享销客天使投资人、前执行总裁,具有20年企业信息化和6年SaaS营销团队创新经验。 前天和一个做SaaS的团队交流,他们处在我说的《SaaS创业路线图》中的“产品打磨”阶段 —— 产品已经做出来,也找到了少量试用客户。 这时候遇到一个大家常见的问题:目标客户提出的需求超越了我们初定的需求边界,要不要做定制开发?这个问题,不少创业公司都会遇到。每家都有难念的经,具体情况各不相同,今天我为大家写几条原则吧。 第一,明确自己是做产品的,还是做项目的。做项目的公司
腾讯SaaS加速器
2020/06/09
1.1K0
信号量--System V信号量 与 Posix信号量
信号量是一种计数器,用来控制对多个进程/线程共享的资源进行访问。常和锁一同使用。 在某个进程/线程正在对某个资源进行访问时,信号量可以阻止另一个进程/线程去打扰。 生产者和消费者模型是信号量的典型使用。
看、未来
2020/08/26
1.7K0
聊聊有界上下文
在这篇文章中,我将分享我对有界上下文的看法。有界上下文是什么意思?为什么需要有界上下文?
双愚
2018/07/09
2K0
聊聊有界上下文
基于数组的有界阻塞队列 —— ArrayBlockingQueue
" 在阅读完和 AQS 相关的锁以及同步辅助器之后,来一起阅读 JUC 下的和队列相关的源码。先从第一个开始:ArrayBlockingQueue。 "
程序员小航
2020/11/23
9100
基于数组的有界阻塞队列 —— ArrayBlockingQueue
java并发编程(五)
阻塞队列:在某些情况下,会挂起线程,一旦条件满足,被挂起的线程会自动唤醒。而阻塞队列无需关心什么时候阻塞,什么时候唤醒。
疯狂的KK
2020/03/25
3010
brpc小课堂:有界队列BoundedQueue
brpc实现了一个“有界队列”的类模板BoundedQueue。先说一下什么是有界队列。 所谓有界队列表示的就是一个队列其中的容量是有限的(固定的),不能动态扩容的队列。这种听起来没有vector那种自动扩容能力的容器,主要还是全面为了性能考虑的。一般也是用作生产者和消费者模式,当队列容量已满的时候,一般就表示超过了这个队列的最大吞吐能力,故而拒绝加入新的任务。
果冻虾仁
2021/12/30
7190
brpc小课堂:有界队列BoundedQueue
信号量
1.初始化信号量 函数原型:int sem_init(sem_t* sem,int pshared,unsigned int value) 参数: sem:指定是哪一个信号量 pshared:指定信号量的类型,值为0表示是在当前进程使用的局部信号量,否则该信号量就可以在多个进程中共享。 value:指定信号量的初始值,可以理解为最多由多少个线程可以访问共享资源。 返回值:
lexingsen
2022/02/25
4740
信号量
Hystrix内部提供了两种模式执行逻辑:信号量和线程池。默认情况下,Hystrix使用线程池模式。那什么是信号量呢?
只喝牛奶的杀手
2019/08/26
6630
Python中线程同步与线程锁「建议收藏」
概念 * 线程同步,线程间协同,通过某种技术,让一个线程访问某些数据时,其他线程不能访问这些数据,直到该线程完 成对数据的操作。
全栈程序员站长
2022/08/31
7320
Python中线程同步与线程锁「建议收藏」
学会等待
摘要总结:学会等待是一种能力——控制自己的能力。当内心特别热衷于某一个东西的时候,提醒一下自己很重要。
雷大亨
2017/12/29
1.4K0
分布式锁中的王者方案 - Redisson
如果你之前是在用 Redis 的话,那使用 Redisson 的话将会事半功倍,Redisson 提供了使用 Redis的最简单和最便捷的方法。
macrozheng
2021/07/02
1.6K0
分布式锁中的王者方案 - Redisson
临界区 互斥量 事件 信号量_互斥信号量与同步信号量
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2、互斥量:为协调共同对一个共享资源的单独访问而设计的。 3、信号量:为控制一个具有有限数量用户资源而设计。 4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
全栈程序员站长
2022/09/23
8310
基于链表的有界阻塞队列 —— LinkedBlockingQueue
" 上一节看了基于数据的有界阻塞队列 ArrayBlockingQueue 的源码,通过阅读源码了解到在 ArrayBlockingQueue 中入队列和出队列操作都是用了 ReentrantLock 来保证线程安全。下面咱们看另一种有界阻塞队列:LinkedBlockingQueue。 "
程序员小航
2020/11/23
5920
基于链表的有界阻塞队列 —— LinkedBlockingQueue
分布式锁中的王者方案 - Redisson
上篇讲解了如何用 Redis 实现分布式锁的五种方案,但我们还是有更优的王者方案,就是用 Redisson。
悟空聊架构
2022/05/13
1.3K0
分布式锁中的王者方案 - Redisson
Selenium4+Python3系列(六) - Selenium的三种等待,强制等待、隐式等待、显式等待
用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了。
软件测试君
2022/12/05
3K0
Selenium4+Python3系列(六) - Selenium的三种等待,强制等待、隐式等待、显式等待
点击加载更多

相似问题

带有Web组件的Dart服务器

10

在web服务器中运行dart

41

Dart: web web/src

13

节点web服务器崩溃

20

在dart中使用parseInt时服务器崩溃?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文