精华内容
下载资源
问答
  • 实现一边录音一边转化为文字的功能我们知道,讯飞可以实现在线语音转化功能,可以将语音实时的进行翻译,同时录音,但是这个实时转为文字功能,不是长连接,是个短连接,导致没法长时间的实现一边录音一边转换功能,...

    实现一边录音一边转化为文字的功能

    我们知道,讯飞可以实现在线语音转化功能,可以将语音实时的进行翻译,同时录音,但是这个实时转为文字功能,不是长连接,是个短连接,导致没法长时间的实现一边录音一边转换功能,本文便是为此完成的一种思路设计。

    主要动作:本来实现的是一直去检测录音,当语音识别库停止录音后重启语音识别,让继续实现转换。这里因为出现一个问题,当再次重启时,之前的录音文件则会丢掉,这样使得我们本地的录音文件不完整,于是换了一种新的思路。主要依据于语音识别可以传语音数据,让识别。那么我们可以去做如此设计:让本地一直录音,录音过程实时将录音数据传给语音识别,完成转换功能。思路描述完成,具体实现代码:(不能提供完整的代码,给出主要代码)

        private void creatAudioRecord() {
            // 获得缓冲区字节大小
            bufferSizeInBytes = AudioRecord.getMinBufferSize(AudioFileFunc.AUDIO_SAMPLE_RATE,
                    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
            // 创建AudioRecord对象
            audioRecord = new AudioRecord(AudioFileFunc.AUDIO_INPUT, AudioFileFunc.AUDIO_SAMPLE_RATE,
                    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes);
        }
           private void writeDateToFileAndRecongnizer() {
            // new一个byte数组用来存一些字节数据,大小为缓冲区大小
            byte[] audiodata = new byte[bufferSizeInBytes];
            FileOutputStream fos = null;
            int readsize = 0;
            try {
                File file = FileUtils.makeFilePath(getOutBase(), mOutPcm);
                if (file.exists()) {
                    file.delete();
                }
                fos = new FileOutputStream(file);// 建立一个可存取字节的文件
            } catch (Exception e) {
                e.printStackTrace();
            }
            while (mIsRecognizer && !Thread.currentThread().isInterrupted()) {
                readsize = audioRecord.read(audiodata, 0, bufferSizeInBytes);
                if (AudioRecord.ERROR_INVALID_OPERATION != readsize && fos != null) {
                    try {
                        mSpeechRecognizer.writeAudio(audiodata, 0, audiodata.length);
                        fos.write(audiodata);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            try {
                if (fos != null)
                    fos.close();// 关闭写入流
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        mSpeechRecognizer = SpeechRecognizer.createRecognizer(DiaryPost.this, mInitListener);
         /**
         * 初始化监听器。
         */
        private InitListener mInitListener = new InitListener() {
    
            @Override
            public void onInit(int code) {
                L.d("SpeechRecognizer init() code = " + code);
                if (code != ErrorCode.SUCCESS) {
                    showToast("初始化失败,错误码:" + code);
                }
            }
        };
        /**
         * 听写监听器。
         */
        private RecognizerListener recognizerListener = new RecognizerListener() {
    
            @Override
            public void onBeginOfSpeech() {
                if (!mIsRecognizer) {
                    onRecognizerEnd();
                }
            }
    
            @Override
            public void onError(SpeechError error) {
                if (mIsRecognizer) {
                    onRecognizerStart();
                }
            }
    
            @Override
            public void onEndOfSpeech() {
                if (mIsRecognizer) {
                    onRecognizerStart();
                }
            }
    
            @Override
            public void onResult(RecognizerResult results, boolean isLast) {
                showResult(results);
                if (isLast) {
                    // TODO 最后的结果
                }
            }
    
            @Override
            public void onVolumeChanged(int i, byte[] bytes) {
                if (mIsRecognizer) {
                    int decibel = calculateDecibel(bytes);
                    mVisualizer.receive(decibel);
                }
    
            }
    
            @Override
            public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
            }
        };
    
           private void showResult(RecognizerResult results) {
            String text = JsonParser.parseIatResult(results.getResultString());
            mSpeechRecognizerIndex++;
            mSpeechRecognizerResults.put(mSpeechRecognizerIndex, text);
            StringBuffer resultBuffer = new StringBuffer();
            for (int key : mSpeechRecognizerResults.keySet()) {
                resultBuffer.append(mSpeechRecognizerResults.get(key));
            }
            mEditText.setText(resultBuffer.toString());
            mEditText.setSelection(mEditText.length());
        }
    
           public void bindParams() {
            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
            // 清空参数
            mSpeechRecognizer.setParameter(SpeechConstant.PARAMS, null);
            mSpeechRecognizer.setParameter(SpeechConstant.AUDIO_SOURCE, "-1");
            // 设置听写引擎
            mSpeechRecognizer.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
            // 设置返回结果格式
            mSpeechRecognizer.setParameter(SpeechConstant.RESULT_TYPE, "json");
            String lag = sp.getString("iat_language_preference",
                    "mandarin");
            if (lag.equals("en_us")) {
                // 设置语言
                mSpeechRecognizer.setParameter(SpeechConstant.LANGUAGE, "en_us");
            } else {
                // 设置语言
                mSpeechRecognizer.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
                // 设置语言区域
                mSpeechRecognizer.setParameter(SpeechConstant.ACCENT, lag);
            }
    
            // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
            mSpeechRecognizer.setParameter(SpeechConstant.VAD_BOS, sp.getString("iat_vadbos_preference", "3000"));
    
            // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
            mSpeechRecognizer.setParameter(SpeechConstant.VAD_EOS, sp.getString("iat_vadeos_preference", "1000"));
    
            // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
            mSpeechRecognizer.setParameter(SpeechConstant.ASR_PTT, sp.getString("iat_punc_preference", "1"));
    
            // 设置听写结果是否结果动态修正,为“1”则在听写过程中动态递增地返回结果,否则只在听写结束之后返回最终结果
            // 注:该参数暂时只对在线听写有效
            mSpeechRecognizer.setParameter(SpeechConstant.ASR_DWA, sp.getString("iat_dwa_preference", "0"));
        }
    
            private void onRecognizerStart() {
            Intent intent = new Intent();
            bindParams();
            mSpeechRecognizer.startListening(recognizerListener);
        }
    展开全文
  • 【Java面试题】List如何一边遍历,一边删除?

    万次阅读 多人点赞 2020-03-20 12:10:36
    List如何一边遍历,一边删除?

    这是最近面试时被问到的1道面试题,本篇博客对此问题进行总结分享。

    1. 新手常犯的错误

    可能很多新手(包括当年的我,哈哈)第一时间想到的写法是下面这样的:

    public static void main(String[] args) {
        List<String> platformList = new ArrayList<>();
        platformList.add("博客园");
        platformList.add("CSDN");
        platformList.add("掘金");
    
        for (String platform : platformList) {
            if (platform.equals("博客园")) {
                platformList.remove(platform);
            }
        }
    
        System.out.println(platformList);
    }
    

    然后满怀信心的去运行,结果竟然抛java.util.ConcurrentModificationException异常了,翻译成中文就是:并发修改异常。


    是不是很懵,心想这是为什么呢?

    让我们首先看下上面这段代码生成的字节码,如下所示:

    由此可以看出,foreach循环在实际执行时,其实使用的是Iterator,使用的核心方法是hasnext()next()

    然后再来看下ArrayList类的Iterator是如何实现的呢?

    可以看出,调用next()方法获取下一个元素时,第一行代码就是调用了checkForComodification();,而该方法的核心逻辑就是比较modCountexpectedModCount这2个变量的值。

    在上面的例子中,刚开始modCountexpectedModCount的值都为3,所以第1次获取元素"博客园"是没问题的,但是当执行完下面这行代码时:

    platformList.remove(platform);
    

    modCount的值就被修改成了4。

    所以在第2次获取元素时,modCountexpectedModCount的值就不相等了,所以抛出了java.util.ConcurrentModificationException异常。

    既然不能使用foreach来实现,那么我们该如何实现呢?

    主要有以下3种方法:

    1. 使用Iterator的remove()方法
    2. 使用for循环正序遍历
    3. 使用for循环倒序遍历

    接下来一一讲解。

    2. 使用Iterator的remove()方法

    使用Iterator的remove()方法的实现方式如下所示:

    public static void main(String[] args) {
        List<String> platformList = new ArrayList<>();
        platformList.add("博客园");
        platformList.add("CSDN");
        platformList.add("掘金");
    
        Iterator<String> iterator = platformList.iterator();
        while (iterator.hasNext()) {
            String platform = iterator.next();
            if (platform.equals("博客园")) {
                iterator.remove();
            }
        }
    
        System.out.println(platformList);
    }
    

    输出结果为:

    [CSDN, 掘金]

    为什么使用iterator.remove();就可以呢?

    让我们看下它的源码:

    可以看出,每次删除一个元素,都会将modCount的值重新赋值给expectedModCount,这样2个变量就相等了,不会触发java.util.ConcurrentModificationException异常。

    3. 使用for循环正序遍历

    使用for循环正序遍历的实现方式如下所示:

    public static void main(String[] args) {
        List<String> platformList = new ArrayList<>();
        platformList.add("博客园");
        platformList.add("CSDN");
        platformList.add("掘金");
    
        for (int i = 0; i < platformList.size(); i++) {
            String item = platformList.get(i);
    
            if (item.equals("博客园")) {
                platformList.remove(i);
                i = i - 1;
            }
        }
    
        System.out.println(platformList);
    }
    

    这种实现方式比较好理解,就是通过数组的下标来删除,不过有个注意事项就是删除元素后,要修正下下标的值:

    i = i - 1;
    

    为什么要修正下标的值呢?

    因为刚开始元素的下标是这样的:

    第1次循环将元素"博客园"删除后,元素的下标变成了下面这样:

    第2次循环时i的值为1,也就是取到了元素”掘金“,这样就导致元素"CSDN"被跳过检查了,所以删除完元素后,我们要修正下下标,这也是上面代码中i = i - 1;的用途。

    4. 使用for循环倒序遍历

    使用for循环倒序遍历的实现方式如下所示:

    public static void main(String[] args) {
        List<String> platformList = new ArrayList<>();
        platformList.add("博客园");
        platformList.add("CSDN");
        platformList.add("掘金");
    
        for (int i = platformList.size() - 1; i >= 0; i--) {
            String item = platformList.get(i);
    
            if (item.equals("掘金")) {
                platformList.remove(i);
            }
        }
    
        System.out.println(platformList);
    }
    

    这种实现方式和使用for循环正序遍历类似,不过不用再修正下标,因为刚开始元素的下标是这样的:

    第1次循环将元素"掘金"删除后,元素的下标变成了下面这样:

    第2次循环时i的值为1,也就是取到了元素”CSDN“,不会导致跳过元素,所以不需要修正下标。

    5. 评论区释疑(2020-06-15更新)

    5.1 使用removeIf()方法(推荐)

    从JDK1.8开始,可以使用removeIf()方法来代替 Iteratorremove()方法实现一边遍历一边删除,其实,IDEA中也会提示:


    所以原来的代码:

    Iterator<String> iterator = platformList.iterator();
    while (iterator.hasNext()) {
        String platform = iterator.next();
        if (platform.equals("博客园")) {
            iterator.remove();
        }
    }
    

    就可以简化为如下所示的1行代码,非常简洁:

    platformList.removeIf(platform -> "博客园".equals(platform));
    

    看下removeIf()方法的源码,会发现其实底层也是用的Iteratorremove()方法:

    5.2 使用for循环正序遍历,是否需要修正下标?

    先说结论:需要。

    不过之前文中举得例子不是太好,所以好多读者看完认为不修正下标也是可以的,其实不是,我们换个例子来理解:

    List<String> platformList = new ArrayList<>();
    platformList.add("博客园");
    platformList.add("博客园");
    platformList.add("CSDN");
    platformList.add("掘金");
    
    for (int i = 0; i < platformList.size(); i++) {
    	String item = platformList.get(i);
        if ("博客园".equals(item)) {
        	platformList.remove(i);
        }
    }
    
    System.out.println(platformList);
    

    输出结果:

    [博客园, CSDN, 掘金]

    可以发现,如果不修正下标,第2个元素“博客园”在循环遍历时被跳过了,也就无法删除,所以一定要修正下标:

    6. 参考

    Java集合怎么一边删除一边遍历

    java 为什么遍历的时候不能删除元素

    注:如果觉得本篇博客有任何错误或者更好的建议,欢迎留言,我会及时跟进并更正博客内容!

    文章持续更新,欢迎关注微信公众号「申城异乡人」第一时间阅读!

    展开全文
  • set一边遍历一边删除

    2020-07-02 15:52:30
    set一边遍历一边删除 Set<String> set = new HashSet<String>(); set.add("a"); set.add("b"); set.add("c"); Set<String> setsSet = new HashSet<String>(set); Iterator<...

    set一边遍历一边删除

    Set<String> set = new HashSet<String>();
    set.add("a");
    set.add("b");
    set.add("c");
    Set<String> setsSet = new HashSet<String>(set);
    Iterator<String> iterator = setsSet.iterator();
    while(iterator.hasNext()) {
    	String string = iterator.next();
    	set.remove(string);
    }
    System.out.println(set.size());
    
    展开全文
  • vector对象一边遍历一边删除元素

    千次阅读 2017-04-11 21:43:35
    今天做携程的笔试题,附加编程题是删除一行字符串里面的标点符号,关于一边遍历一边删除的问题,坑踩到好几次了,真是好气啊,明明很简单的问题,写下来防止自己忘了 自己忘了else的条件了,结果最后老不出结果,一...

    今天做携程的笔试题,附加编程题是删除一行字符串里面的标点符号,关于一边遍历一边删除的问题,坑踩到好几次了,真是好气啊,明明很简单的问题,写下来防止自己忘了

    自己忘了else的条件了,结果最后老不出结果,一调试发现死循环了,真的好气啊

    bool f(vector<char> &str) {
    	int end = str.size();
    	bool state = false;
    	auto it = str.begin();
    	while (it != str.end())
    	{
    		if (ispunct(*it))
    		{
    			state = true;
    			it = str.erase(it);
    		}
    		else
    			it++;
    
    	}
    	return state;
    
    }


    展开全文
  • while语句

    千次阅读 2016-07-15 11:25:29
    while(条件表达式)  语句1; 说明:语句1是while循环语句的循环体,它将在满足条件的情况下被重复执行。 格式2: while(条件表达式) {  语句1;  语句2;  ...; } 说明:循环体部分由多个语句组成,应由...
  • while用法

    2019-08-01 04:30:10
    He's out banging other women over the head with a club, while she sits at home trying to get the mastodon smell out of the carpet!---《老友记》第一季 第二集 He's out banging other women over the head...
  • python while 循环

    2018-12-03 17:38:29
    #用while来循环 while,翻译成中文是“当…的时候”,这个单词在英语中,常常用来做为时间状语,while … someone do somthing,这种类型的说法是有的。在python中,它也有这个含义,不过有点区别的是,“当…时候”...
  • 使用List数组实现一边遍历一边删除

    千次阅读 2021-01-21 15:52:56
    public class ListForTest { ... //List如何一边遍历,一边删除? ArrayList<User> userList = Lists.newArrayList( new User().setId("A").setName("张三"), new User().setId("B").setNa
  • MySql 一边一边

    千次阅读 2014-08-21 20:51:25
     while((temp=buffer.readLine())!=null){  System.out.println(temp);  bw.write(temp+"\n");  bw.flush();  }  bw.close();  fw.close();  buffer.close();  }  }finally{  JdbcYh...
  • // clear to let GC do its work } 所以在第2次获取元素时,modCount和expectedModCount的值就不相等了,所以抛出了异常ConcurrentModificationException 那么List一边遍历一边删除正确的实现方法有哪些呢?...
  • map>::iterator it=co.begin(); while(it!=co.end()){ if(it->second==0)co.erase(it);  it++; } 不管删不删除,都是it++;
  • 那我们是否能在计算的过程中,一边计算一边生成喃?答案是肯定的,我们使用生成器generator。   2.生成器的创建很简单,最简单的一种是把生成式的[]替换成() a= [x*x for x in range(10)] print(type(a)) b= (x*...
  • Java集合怎么一边删除一边遍历

    千次阅读 2016-12-09 22:33:55
    问题描述:  Java 新手容易犯一个错误,就是遍历集合的同时删除集合的元素。那么程序会发生什么呢?下面举个小例子。...所以,可以采用Iterator中的remove()方法来实现集合的一边删除一边遍历。
  • while i &lt; len(nums): del nums[i] print(nums)虽然,不推荐在迭代的过程中不能进行增删操作,但在一些要求额外空间复杂度为O(1)的题目(例如:LeetCode 26)中必须要进行这样的操作。一个要点:每次循环均...
  • C++ vector一边遍历一边删除元素

    千次阅读 2014-12-04 11:38:03
    转自:  ... ...使用iterator迭代器对vector进行...while ( it != ObjectVector . end ()){ if ((* it )-> IsAlive ()){ it ++; } else { it = ObjectVector . erase ( it ); } }
  • while (instream.available()>0){ int size = instream.read(buffer); audioplayer.write(buffer, 0 , size);//不断播放数据 } } catch (IOException e) { e.printStackTrace(); } } } public void stop...
  • while(1){ sleep(1); for(i=0;i;i++){ r.id=i; r.length=i; r.width=i; vec.push_back(r); } } return NULL; } void * delete4(void *argc){ while(1){ vector<Rect>::iterator it=vec...
  • while read loop

    千次阅读 2012-07-04 11:45:27
    cut -d: -f3 /etc/passwd | while read line do if [ $line -ge 500 ] then let res++ echo $res fi done echo $res 脚本实现的功能就是统计UID大于500的项之和。下面是输|出结果 1 2 3 4 5 6 7 8 9 10 0...
  • 上面的代码会报错,ConcurrenModificationException异常,原因是,集合不可以一边遍历一边删除。ConcurrentModificationException是Java集合的一个快速失败(fail-fast)机制,防止多个线程同时修改同一个集合的元素...
  • 循环结构 编写的代码可能被执行多次 什么是循环 ​ 程序中反复执行的相同或相似代码的现象 循环的要素 1、循环次数(循环变量) ...while循环结构 1)while循环 while(条件){ //条件为真时运行的代码 }...
  • when和while的区别

    2019-07-06 20:09:00
    when和while的区别①when是at or during the time that, 既指时间点,也可指一段时间;while是during the time that,只指一段时间,因此when引导的时间状语从句中的动词可以是终止性动词,也可以是延续性动词,而...
  • SPI详细解释 转载qq_42282258 最后发布于2018-08-05 23:04:44 阅读数 9980 收藏 本文的程序是主控室... } 1 5.2 SPI写1个字节 uint8 Send_Byte(uint8 data) { //发送不为空 while(!(SPI1->SR & SPI_I2S_FLAG_TXE));...
  • js中的do...while

    2019-03-02 12:14:35
    i = 0 do{ document.write("数字是 " + i) document.write("&lt;br /&...不满足条件,也会执行一边函数体。 i = 0 do{ document.write("数字是 " + i) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 61,159
精华内容 24,463
关键字:

while一边一边