ibm-watson - 关于扬声器标签如何在 android 中显示扬声器标签
问题描述
请帮助我解决这个问题我差不多 1 周解决了这个问题但我不能请帮助我这是我的日志演示中的结果相同这是我在 RecognizeOptions 中的代码
private RecognizeOptions getRecognizeOptions(InputStream captureStream) {
return new RecognizeOptions.Builder()
.timestamps(true)
.contentType(HttpMediaType.AUDIO_MP3)
.interimResults(true)
.smartFormatting(true)
.inactivityTimeout(2000)
.speakerLabels(true)
.audio(captureStream)
.wordAlternativesThreshold((float) 0.01)
.wordConfidence(true)
.model("en-US_BroadbandModel")
.build();
}
这是我显示扬声器和单词的代码
私有类 MicrophoneRecognizeDelegate 扩展 BaseRecognizeCallback {
@Override
public void onTranscription(SpeechRecognitionResults speechResults) {
System.out.println(speechResults);
SpeakerLabelsDiarization.RecoTokens recoTokens = new SpeakerLabelsDiarization.RecoTokens();
if(speechResults.getSpeakerLabels() !=null) {
recoTokens.add(speechResults);
String speaks = "Speaker " + speechResults.getSpeakerLabels().get(0).getSpeaker().toString();
showMicText(speaks);
System.out.println(speaks);
}if(speechResults.getResults() != null && !speechResults.getResults().isEmpty()) {
String text = speechResults.getResults().get(0).getAlternatives().get(0).getTranscript();
showMicText1(text);
}
}
关于 SpeakerLabelsDiarization.RecoTokens recoTokens = new SpeakerLabelsDiarization.RecoTokens(); 这是我在 github 的 WatBot 示例中获得此代码的代码
package com.example.ezminute.activities;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.RecognizeOptions;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.SpeakerLabelsResult;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.SpeechRecognitionAlternative;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.SpeechRecognitionResult;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.SpeechRecognitionResults;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.SpeechTimestamp;
import com.ibm.watson.developer_cloud.speech_to_text.v1.websocket.BaseRecognizeCallback;
import com.ibm.watson.developer_cloud.util.GsonSingleton;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
public class SpeakerLabelsDiarization {
public static class RecoToken {
private Double startTime;
private Double endTime;
private Long speaker;
private String word;
private Boolean spLabelIsFinal;
/**
* Instantiates a new reco token.
*
* @param speechTimestamp the speech timestamp
*/
RecoToken(SpeechTimestamp speechTimestamp) {
startTime = speechTimestamp.getStartTime();
endTime = speechTimestamp.getEndTime();
word = speechTimestamp.getWord();
}
/**
* Instantiates a new reco token.
*
* @param speakerLabel the speaker label
*/
RecoToken(SpeakerLabelsResult speakerLabel) {
startTime = Double.valueOf(speakerLabel.getFrom());
endTime = Double.valueOf(speakerLabel.getTo());
speaker = speakerLabel.getSpeaker();
}
/**
* Update from.
*
* @param speechTimestamp the speech timestamp
*/
public void updateFrom(SpeechTimestamp speechTimestamp) {
word = speechTimestamp.getWord();
}
/**
* Update from.
*
* @param speakerLabel the speaker label
*/
public void updateFrom(SpeakerLabelsResult speakerLabel) {
speaker = speakerLabel.getSpeaker();
}
}
/**
* The Class Utterance.
*/
public static class Utterance {
private Integer speaker;
private String transcript;
/**
* Instantiates a new utterance.
*
* @param speaker the speaker
* @param transcript the transcript
*/
public Utterance(final Integer speaker, final String transcript) {
this.speaker = speaker;
this.transcript = transcript;
}
}
/**
* The Class RecoTokens.
*/
public static class RecoTokens {
private Map<Double, RecoToken> recoTokenMap;
/**
* Instantiates a new reco tokens.
*/
public RecoTokens() {
recoTokenMap = new LinkedHashMap<Double, RecoToken>();
}
/**
* Adds the.
*
* @param speechResults the speech results
*/
public void add(SpeechRecognitionResults speechResults) {
if (speechResults.getResults() != null)
for (int i = 0; i < speechResults.getResults().size(); i++) {
SpeechRecognitionResult transcript = speechResults.getResults().get(i);
if (transcript.isFinalResults()) {
SpeechRecognitionAlternative speechAlternative = transcript.getAlternatives().get(0);
for (int ts = 0; ts < speechAlternative.getTimestamps().size(); ts++) {
SpeechTimestamp speechTimestamp = speechAlternative.getTimestamps().get(ts);
add(speechTimestamp);
}
}
}
if (speechResults.getSpeakerLabels() != null)
{
for (int i = 0; i < speechResults.getSpeakerLabels().size(); i++) {
add(speechResults.getSpeakerLabels().get(i));
}
}
}
/**
* Adds the.
*
* @param speechTimestamp the speech timestamp
*/
public void add(SpeechTimestamp speechTimestamp) {
RecoToken recoToken = recoTokenMap.get(speechTimestamp.getStartTime());
if (recoToken == null) {
recoToken = new RecoToken(speechTimestamp);
recoTokenMap.put(speechTimestamp.getStartTime(), recoToken);
} else {
recoToken.updateFrom(speechTimestamp);
}
}
/**
* Adds the.
*
* @param speakerLabel the speaker label
*/
public void add(SpeakerLabelsResult speakerLabel) {
RecoToken recoToken = recoTokenMap.get(speakerLabel.getFrom());
if (recoToken == null) {
recoToken = new RecoToken(speakerLabel);
recoTokenMap.put(Double.valueOf(speakerLabel.getFrom()), recoToken);
} else {
recoToken.updateFrom(speakerLabel);
}
if (speakerLabel.isFinalResults()) {
markTokensBeforeAsFinal(speakerLabel.getFrom());
report();
cleanFinal();
}
}
private void markTokensBeforeAsFinal(Float from) {
Map<Double, RecoToken> recoTokenMap = new LinkedHashMap<>();
for (RecoToken rt : recoTokenMap.values()) {
if (rt.startTime <= from)
{
rt.spLabelIsFinal = true;
}
}
}
/**
* Report.
*/
public void report() {
List<Utterance> uttterances = new ArrayList<Utterance>();
Utterance currentUtterance = new Utterance(0, "");
for (RecoToken rt : recoTokenMap.values()) {
if (currentUtterance.speaker != Math.toIntExact(rt.speaker)) {
uttterances.add(currentUtterance);
currentUtterance = new Utterance(Math.toIntExact(rt.speaker), "");
}
currentUtterance.transcript = String.format("%s%s ", currentUtterance.transcript, rt.word);
}
uttterances.add(currentUtterance);
String result = GsonSingleton.getGson().toJson(uttterances);
System.out.println(result);
}
private void cleanFinal() {
Set<Map.Entry<Double, RecoToken>> set = recoTokenMap.entrySet();
for (Map.Entry<Double, RecoToken> e : set) {
if (e.getValue().spLabelIsFinal) {
recoTokenMap.remove(e.getKey());
}
}
}
}
private static CountDownLatch lock = new CountDownLatch(1);
}
这是我的结果
{
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out: "speaker_labels": [
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out: {
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out: "confidence": 0.605,
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out: "final": false,
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out: "from": 2.43,
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out: "speaker": 0,
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out: "to": 2.93
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out: },
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out: {
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out: "confidence": 0.667,
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out: "final": false,
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out: "from": 3.3,
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: "speaker": 1,
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: "to": 3.82
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: },
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: {
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: "confidence": 0.579,
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: "final": false,
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: "from": 4.15,
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: "speaker": 0,
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: "to": 4.69
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: }
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: ]
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: }
2019-03-03 23:21:58.340 4354-4354/? D/io_stats: !@ 179,0 r 137002 5177089 w 48914 1018780 d 7995 317604 f 12673 12674 iot 105310 98590 th 51200 0 0 pt 0 inp 0 0 3948.151
2019-03-03 23:21:58.345 27985-28793/com.example.ezminute I/System.out: {
2019-03-03 23:21:58.345 27985-28793/com.example.ezminute I/System.out: "speaker_labels": [
2019-03-03 23:21:58.345 27985-28793/com.example.ezminute I/System.out: {
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out: "confidence": 0.579,
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out: "final": true,
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out: "from": 4.15,
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out: "speaker": 0,
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out: "to": 4.69
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out: }
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out: ]
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out: }
这是演示中的结果
{
"speaker_labels": [
{
"from": 2.43,
"to": 2.93,
"speaker": 0,
"confidence": 0.605,
"final": false
},
{
"from": 3.3,
"to": 3.82,
"speaker": 1,
"confidence": 0.667,
"final": false
},
{
"from": 4.15,
"to": 4.69,
"speaker": 0,
"confidence": 0.579,
"final": false
}
]
}
{
"speaker_labels": [
{
"from": 4.15,
"to": 4.69,
"speaker": 0,
"confidence": 0.579,
"final": true
}
]
}
这是我的输出
Speaker0: hello hi hello
这是演示中的输出
Speaker 0:
Hello.
Speaker 1:
Hi.
Speaker 0:
Hello.
请帮帮我,我在乞求大家,请帮帮我:( :( :(我不知道该怎么做,请我尽力而为,但这还不够,我需要所有人的帮助,请帮帮我:( :( :(
解决方案
有了这么小的音轨,我假设onTranscription
它只被调用一次。
我认为您的意图是利用 SpeakerLabelsDiarization.RecoTokens 来确定谁在何时说了什么,但您没有使用它。您所做的只是实例化一个实例
SpeakerLabelsDiarization.RecoTokens recoTokens = new SpeakerLabelsDiarization.RecoTokens();
并添加 STT 响应
recoTokens.add(speechResults);
但随后onTranscription
结束并recoTokens
超出范围并消失。让整个练习变得毫无意义。
您的输出来自
String speaks = "Speaker " + speechResults.getSpeakerLabels().get(0).getSpeaker().toString();
这直接来自您从 STT 服务获得的响应。将get(0)
获取并允许您打印数组中的第 0(第 1)个元素。由于您没有迭代,这就是您将要打印的全部内容。
如果你想查看所有的说话者标签,你需要一个 for 循环来遍历响应中的所有说话者标签。
您输出的成绩单是完整的成绩单,不会按说话者标签或时间进行细分。
String text = speechResults.getResults().get(0).getAlternatives().get(0).getTranscript();
我想你想利用recoTokens
你已经设置的,在简要检查时会利用
recoTokens.uttterances()
推荐阅读
- docker - Mac 和 awslogs 上的 Docker
- r - 重塑从长到宽的时间序列数据(每天的时间序列数量不等)
- python-3.x - 具有 groupby 和条件问题的 Lambda 函数
- mongodb - mongo forEach 无法更新文档中的数组
- python - Scikit-learn Pipeline:测试集的预测大小等于训练集的大小
- python - 机器人忽略命令以大写字母开头
- javascript - 使用 .each() 填充数组,但第一个值显示为空
- c - 用于编译和运行 .c 文件的 Visual Studio Code 任务
- javascript - 从 Sketch 到 ReacJs 有哪些可用的选项?
- scala.js - 如何从 ScalaJS leafletJS 调用 Javascript 代码