实现基础语音识别交互系统
语音识别技术,亦称自动语音识别(ASR),是人工智能(AI)领域的一个重要分支。它的核心目标是将人类的语音信号转换为可读的文本信息。这一技术的发展,使得人机交互的方式更为自然和便捷,被广泛应用于客服系统、智能助手、语音翻译等多个领域。CMU Sphinx:CMU Sphinx是一个开源的语音识别引擎,它提供了一个健壮的语音识别平台,并且拥有强大的社区支持。它适用于多种语言,并且可以运行在不同的平台
简介:语音识别是自然语言处理的一个分支,可将语音信号转化为机器理解的文字。本项目利用Java语言开发了一个“你问我答”式的语音识别系统,并探讨了语音识别技术的实现细节。系统通过录音、语音转文本、文本解析、回答生成和文本转语音等步骤,实现了用户的语音交互体验。技术要点包括Java Speech API、第三方服务和自然语言理解技术的应用。 
1. 语音识别技术概述
1.1 语音识别技术简介
语音识别技术,亦称自动语音识别(ASR),是人工智能(AI)领域的一个重要分支。它的核心目标是将人类的语音信号转换为可读的文本信息。这一技术的发展,使得人机交互的方式更为自然和便捷,被广泛应用于客服系统、智能助手、语音翻译等多个领域。
1.2 语音识别技术的应用场景
语音识别技术的应用场景十分广泛,如智能家电的语音控制、车载系统中的语音导航、移动设备中的语音助手等。更进一步,它还可以应用于医疗、教育、法律等行业领域,为特定用户提供专业化的语音输入解决方案。
1.3 语音识别技术的发展趋势
随着深度学习技术的发展和大数据的应用,语音识别的准确性、响应速度和用户交互体验都有了显著的提升。当前,语音识别技术正朝着更高的准确度、更低的延迟和更强的多语言支持方向发展。未来的语音识别技术将更加个性化和智能化,更能适应不同用户的语言习惯和使用环境。
2. Java在语音识别中的应用
2.1 Java语音识别库的选择与使用
Java作为一种成熟的编程语言,在众多应用场景中发挥着重要的作用,包括在语音识别领域。在选择合适的Java语音识别库时,开发者需要考虑库的功能性、性能、社区支持以及兼容性。以下是当前市场中几个主流的Java语音识别库,它们各有特点和应用场景。
2.1.1 介绍主流的Java语音识别库
- CMU Sphinx:CMU Sphinx是一个开源的语音识别引擎,它提供了一个健壮的语音识别平台,并且拥有强大的社区支持。它适用于多种语言,并且可以运行在不同的平台上,包括移动设备。Sphinx提供了从简单到复杂的多种配置,非常适合开发语音识别应用。
- Google Speech API:Google Speech API是一个由谷歌提供的服务,可以提供高精度的语音识别。它支持多种语言,并且是商业级的服务,适用于需要高准确率的应用。由于Google Speech API是基于云计算的服务,因此它易于集成和使用,但需要网络连接。
- Apache OpenNLP:Apache OpenNLP是一个开源的自然语言处理库,它可以处理各种NLP任务,包括语音识别。它使用机器学习的方法来训练模型,适用于需要理解语言语义的复杂应用。
2.1.2 库的安装、配置及基本使用方法
对于CMU Sphinx的安装,开发者可以使用Maven依赖来快速集成。以下是CMU Sphinx的Maven依赖配置示例:
<dependency>
<groupId>edu.cmu.sphinx</groupId>
<artifactId>sphinx4-core</artifactId>
<version>5prealpha</version>
</dependency>
接下来,一个简单的代码示例展示了如何使用CMU Sphinx进行基本的语音识别任务:
import edu.cmu.sphinx.api.Configuration;
import edu.cmu.sphinx.api.SpeechResult;
import edu.cmu.sphinx.api.StreamSpeechRecognizer;
public class SimpleSpeechRecognition {
public static void main(String[] args) throws Exception {
Configuration configuration = new Configuration();
configuration.setAcousticModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us");
configuration.setDictionaryPath("resource:/edu/cmu/sphinx/models/en-us/cmudict-en-us.dict");
StreamSpeechRecognizer recognizer = new StreamSpeechRecognizer(configuration);
StreamSpeechRecognizer recognizeStream = recognizer.startRecognition(true);
// 这里通过一个音频流的输入来实现识别,音频流需要符合识别库的格式要求。
// 以下是伪代码表示,实际操作需要通过麦克风输入或其他方式获取音频流。
AudioInputStream audioStream = AudioSystem.getAudioInputStream(inputStream);
recognizeStream.processStream(audioStream);
SpeechResult result = recognizeStream.getResult();
System.out.println("You said: " + result.getHypothesis());
recognizer.stopRecognition();
}
}
以上代码中,我们首先配置了语音识别器的基本参数,包括声学模型和字典的路径。然后我们创建了一个识别器实例,通过 startRecognition 方法开始实时语音识别,并通过 processStream 方法处理音频流输入,最后通过 getResult 方法获取识别结果。
2.2 Java实现语音识别的流程
实现语音识别的流程大致可以分为以下三个部分:捕获和处理语音数据、集成和调用语音识别引擎、处理和优化识别结果。
2.2.1 语音数据的捕获与处理
在捕获和处理语音数据之前,开发者需要准备好音频输入设备和相应的软件库。例如,可以使用Java Sound API或者第三方库如PortAudio或JNA来捕获音频数据。
获取到原始音频数据后,通常需要进行一些预处理操作,如去噪、静音段的裁剪、能量标准化等,以提高后续识别的准确度。
// 简化的音频处理示例
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputDevice);
AudioFormat format = audioInputStream.getFormat();
if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), format.getSampleSizeInBits(),
format.getChannels(), format.getChannels() * format.getSampleSizeInBits() / 8, format.getSampleRate(), false);
audioInputStream = AudioSystem.getAudioInputStream(format, audioInputStream);
}
// 这里可以添加其他的处理逻辑,例如去除噪声、静音检测等
2.2.2 语音识别引擎的集成与调用
在Java中集成语音识别引擎,我们已经展示了如何使用CMU Sphinx。集成其他引擎的过程大同小异,一般包括添加库的依赖、配置语音模型和字典路径、初始化识别器、处理输入数据和获取识别结果。
// 使用Google Speech API的伪代码示例
GoogleSpeechClient client = GoogleSpeechClient.builder()
.apiKey("your-api-key")
.build();
SpeechResponse response = client.recognize(new AudioInputStream(inputDevice));
String result = response.getResultsList().get(0).getAlternativesList().get(0).getTranscript();
2.2.3 识别结果的处理与优化
识别结果的处理主要是解析识别结果并从中提取有用信息。这通常需要开发者对特定库的输出格式有深刻理解。为了优化识别结果,可以进行后处理操作,比如针对特定领域的词库优化、识别结果的拼写校正、以及使用统计或机器学习方法进一步提高准确性。
// 对识别结果进行简单的后处理示例
String rawResult = "the raw speech recognition output";
String processedResult = rawResult.trim().replaceAll("[^a-zA-Z0-9 ]", "");
// 这里可以添加更多的后处理逻辑,比如特定领域的优化、拼写校正等。
通过以上步骤,我们可以大致了解Java在语音识别中的应用流程,并通过实例代码展示了如何在Java环境中集成和使用语音识别库。在实际应用中,开发者还需要根据具体需求进行调整和优化,以达到最佳的效果。
3. “你问我答”功能实现细节
随着人工智能技术的快速发展,构建一个能够与用户进行自然对话的“你问我答”系统变得日益重要。本章节将详细介绍构建交互式语音识别系统的具体步骤,以及如何将语音识别与自然语言处理(NLP)技术相结合,实现更智能的交互体验。
3.1 交互式语音识别系统的构建
构建一个交互式语音识别系统需要经过需求分析、设计、实现等步骤。而其中,系统设计阶段是至关重要的,它将决定系统的整体架构以及未来的可扩展性。
3.1.1 系统需求分析与设计
首先,我们需要对系统的基本需求进行分析,明确以下几点:
- 系统需要支持的设备与操作系统(如PC、手机或嵌入式设备,以及相应的操作系统)。
- 系统的功能需求,包括语音识别、语音合成、自然语言理解和对话管理等。
- 系统的性能需求,比如响应时间、识别准确率、可扩展性等。
- 用户体验,例如界面友好度、交互流畅性等。
接着,根据需求分析的结果,我们可以设计系统架构。一个基本的架构可以包含以下模块:
- 语音捕获模块:负责从用户设备捕获语音输入。
- 语音处理模块:处理原始语音信号,为识别做准备。
- 识别模块:使用语音识别引擎将处理后的语音信号转化为文本。
- NLP处理模块:对识别出的文本进行自然语言理解,包括意图识别、实体提取等。
- 对话管理模块:根据NLP处理结果,结合上下文,生成对应的响应。
- 语音合成模块:将文本响应转化为语音输出给用户。
3.1.2 问答流程的逻辑实现
问答流程的实现是构建交互式语音识别系统的核心部分。这个流程涉及到用户的提问(语音输入)到系统响应(语音输出)的完整过程。
为了实现这个流程,我们需要编写代码来实现每个模块的功能。在实现的过程中,我们会遇到一些挑战,比如如何提高语音识别的准确率、如何处理多种口音和噪音情况、如何让系统理解用户的意图等。
接下来,我们将深入探讨如何将语音识别与自然语言处理技术相结合,以应对这些挑战。
3.2 语音识别与自然语言处理的融合
语音识别和自然语言处理的结合是实现高效“你问我答”系统的关键。自然语言处理可以让我们更好地理解用户的意图,并提供更精准的回答。
3.2.1 语言模型的建立与训练
语言模型是自然语言处理的基础,它能够帮助系统更好地理解和预测自然语言中的单词序列。在构建语言模型时,通常需要大量文本数据作为训练材料。
一个典型的语言模型构建流程包括以下步骤:
- 数据收集:收集大量的文本数据,可以是新闻、书籍、对话记录等。
- 数据预处理:对收集到的数据进行清洗,去除无关信息,如HTML标签、特殊字符等,并进行分词处理。
- 模型训练:使用算法对预处理后的数据进行训练,得到语言模型。常用的算法有n-gram、隐马尔可夫模型、神经网络语言模型等。
- 模型评估:通过测试集对训练好的模型进行评估,确保模型的效果。
在实际应用中,语言模型的训练和优化是持续不断的过程,随着更多数据的积累,模型会变得更加精确。
3.2.2 语音意图识别与分类
在语言模型建立之后,系统需要对用户的语音输入进行意图识别和分类,以确定用户想要执行的操作或查询的信息类型。这是一个多步骤的过程,包括实体识别、意图分类和上下文管理。
首先,实体识别是从用户的语音输入中提取关键信息的过程,如时间、地点、人名等。
接着,意图分类是将用户的语音输入归类到相应的意图类别中,例如查询天气、预定酒店、播放音乐等。
最后,上下文管理是在连续对话中维持和更新对话状态的过程。系统需要记住之前对话的内容,以便提供连贯的回答。
为了实现这些功能,我们可以使用机器学习方法,如支持向量机(SVM)、决策树、深度学习等。这些方法各有优势和特点,在实际应用中需要根据具体场景选择合适的技术。
在此基础上,我们还需要考虑系统的优化,如何通过算法提升意图识别的准确率,如何处理歧义等问题,这将在后续章节中详细讨论。
3.3 代码实现与实践
在系统需求分析、设计以及语言模型和意图识别的理论基础上,下一步我们将着手实现代码,并在实践中不断优化系统。
实现示例代码
这里,我们提供一个简化的示例,展示如何使用Python编程语言实现一个基本的语音识别和意图识别模块:
import speech_recognition as sr
from意图识别器 import 意图识别器
# 初始化语音识别器
识别器 = sr.Recognizer()
# 捕获用户语音输入
with sr.Microphone() as source:
print("请说话...")
audio = 识别器.listen(source)
# 使用语音识别器将语音转换为文本
try:
text = 识别器.recognize_google(audio, language='zh-CN')
print("你说了: " + text)
# 使用意图识别器识别用户意图
意图 = 意图识别器.识别(text)
if 意图 == "查询天气":
print("今天的天气是晴朗的。")
elif 意图 == "播放音乐":
print("正在为您播放音乐...")
else:
print("对不起,我还不明白您的意思。")
except sr.UnknownValueError:
print("无法理解您的语音,请再说一遍...")
except sr.RequestError as e:
print("语音服务出错; {0}".format(e))
在这个示例中,我们首先使用了 speech_recognition 库来捕获用户的语音输入,并将其转换为文本。然后,我们假设有一个 意图识别器 的类,这个类可以识别文本中的用户意图,并返回相应的操作结果。
请注意,这只是一个非常简化的示例,实际应用中需要处理更多细节,如错误处理、多意图处理、上下文管理等。
实践中的优化
在实践的过程中,我们可能会遇到各种挑战,比如语音识别的准确率不够高、在嘈杂的环境中识别效果差、识别速度慢等问题。针对这些问题,我们可以采取以下一些优化措施:
- 使用更高精度的语音识别引擎或库。
- 在数据收集阶段增加噪声数据,进行对抗训练,提升模型的鲁棒性。
- 对音频信号进行预处理,如降噪、回声消除、自动增益控制等。
- 使用更快的硬件设备,以提高处理速度。
- 采用动态调整算法参数的策略,以适应不同的使用环境。
以上是交互式语音识别系统构建过程中的主要细节和代码实现示例。在后续章节中,我们将继续探讨如何将语音识别与自然语言处理进一步融合,以及在项目实践中进一步优化系统性能。
4. 录音与语音转文本技术
4.1 录音技术的原理与实践
4.1.1 录音设备与格式选择
录音设备的选择是录音技术的第一步,也是至关重要的一步。好的录音设备可以为后续的语音转文本技术提供更加清晰、无杂音的音频源。在选择录音设备时,需要考虑以下几个关键因素:
- 频率响应 :好的录音设备应该有较宽的频率响应范围,能够捕捉人声中的低频和高频部分,保证录音的全面性和细腻度。
- 信噪比 :信噪比越高,表示录音中背景噪音越低,语音质量越好。一般信噪比超过60dB的录音设备,即可用于专业录音。
- 采样率和位深 :高质量的录音通常要求较高的采样率和位深。CD音质的标准是44.1kHz/16位。更高要求可以使用48kHz/24位。
录音格式的选择同样重要,常见的音频文件格式有:
- WAV :非压缩音频格式,保真度高,但文件体积大。
- MP3 :压缩格式,文件体积小,音质与压缩率相关,但需要编码和解码过程。
- FLAC :无损压缩格式,压缩比适中,音质好,文件体积比WAV小。
4.1.2 实现高质量音频捕获的技术要点
高质量的音频捕获不仅依赖于高质量的硬件,还需要合适的软件和正确的设置。以下是一些实现高质量音频捕获的技术要点:
- 环境选择 :选择一个回声较少、背景噪音低的环境进行录音,可以大幅提高录音质量。
- 设备摆放 :正确摆放麦克风,避免直接对着扬声器录音,防止回声。
- 录音软件配置 :配置合适的录音软件,确保采样率和位深达到高质量标准。
- 增益设置 :在录音前调整输入增益,避免录音时出现削波或信号太弱。
- 音量标准 :确保录音音量保持在合适水平,既不过高也不过低,有利于后期处理。
4.2 语音转文本技术的实现
4.2.1 自动语音识别(ASR)技术概述
自动语音识别(ASR)技术是指将人类的语音信号转化为可读的文本或命令。ASR技术发展至今,已经形成了一套复杂的流程和算法,包括但不限于信号处理、特征提取、声学模型、语言模型以及解码等环节。
ASR系统的处理流程一般如下:
- 信号预处理 :消除噪音、回声,并将声波信号转换为数字信号。
- 特征提取 :从处理后的信号中提取有用的特征,如MFCC(梅尔频率倒谱系数)。
- 声学模型 :使用统计或深度学习方法建立声音与文字的对应关系。
- 语言模型 :提供语言的统计信息,如词的搭配、句子结构等,帮助提升识别准确率。
- 解码与识别 :结合声学模型和语言模型的结果,通过解码算法输出最终文本。
4.2.2 优化语音识别准确率的策略
在ASR系统中,如何提高语音识别的准确率一直是研究的重点。下面是一些常用的优化策略:
- 个性化训练 :对特定的用户或语音数据进行针对性训练,可以大幅提高其语音识别的准确率。
- 声学模型优化 :使用更多的语料和更先进的训练技术来改进声学模型。
- 语言模型优化 :通过更精确的语言模型和上下文信息的使用,改善文本生成的连贯性和准确性。
- 噪声适应技术 :开发能在噪声环境下工作的算法,减少环境噪音对识别的影响。
- 多通道录音和空间滤波 :使用多个麦克风进行录音,并通过空间滤波技术提升语音信号的质量。
在实现过程中,还应考虑以下几点:
- 用户反馈 :将用户的纠正反馈回系统,以实现持续学习和改进。
- 实时处理 :优化算法以实现实时处理,减少延迟和提升用户体验。
- 降噪处理 :在音频输入端采取主动降噪措施,或在软件端使用先进的噪声消减技术。
通过上述措施,可以显著提升语音转文本的识别效果,让ASR技术更加实用和普及。在实际应用中,往往需要结合多种策略来达到最佳的识别效果。
4.2.3 实例代码
下面是一个简单的Java实现语音识别的代码示例。这个例子使用了Google Cloud Speech-to-Text API来实现语音转文本的功能。
import com.google.cloud.speech.v1p1beta1.SpeechClient;
import com.google.cloud.speech.v1p1beta1.SpeechRecognitionAlternative;
import com.google.cloud.speech.v1p1beta1.SpeechRecognitionResult;
import com.google.cloud.speech.v1p1beta1.RecognitionAudio;
import com.google.cloud.speech.v1p1beta1.RecognitionConfig;
import com.google.cloud.speech.v1p1beta1.RecognitionConfig.AudioEncoding;
import com.google.protobuf.ByteString;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class SpeechToTextExample {
public static void main(String... args) throws Exception {
// Instantiates a client
try (SpeechClient speechClient = SpeechClient.create()) {
// The path to the audio file to transcribe
String fileName = "resources/audio.raw"; // 本地音频文件路径
// Reads the audio file into memory
Path path = Paths.get(fileName);
byte[] data = Files.readAllBytes(path);
ByteString audioBytes = ByteString.copyFrom(data);
// Builds the sync recognize request
RecognitionConfig config = RecognitionConfig.newBuilder()
.setEncoding(AudioEncoding.LINEAR16)
.setSampleRateHertz(16000)
.setLanguageCode("en-US")
.build();
RecognitionAudio audio = RecognitionAudio.newBuilder()
.setContent(audioBytes)
.build();
// Performs speech recognition on the audio file
List<SpeechRecognitionResult> results = speechClient.recognize(config, audio).getResultsList();
for (SpeechRecognitionResult result : results) {
// There can be several alternative transcripts for a given chunk of speech. Just use the first (most likely) one here.
SpeechRecognitionAlternative alternative = result.getAlternativesList().get(0);
System.out.printf("Transcription: %s%n", alternative.getTranscript());
}
}
}
}
代码逻辑解读与参数说明
在上面的代码中,我们首先创建了一个 SpeechClient 实例,用于发起请求到Google Cloud Speech-to-Text API。接着定义了音频文件的路径和音频配置。其中, RecognitionConfig 用于设置音频的编码格式、采样率和语言代码。音频数据通过 ByteString 类型加载到内存中,然后包装成 RecognitionAudio 对象。
调用 recognize 方法后,我们收到了一个包含多个 SpeechRecognitionResult 对象的列表,每个对象代表对音频中一小段声音的识别结果。这里,我们只取每个结果中的第一个 SpeechRecognitionAlternative ,即最可能的识别文本,然后将其打印出来。
注意,代码中硬编码了音频文件路径和音频配置参数。在实际使用时,应根据实际的音频文件和需求调整这些参数。此外,对于大型的语音识别应用,还需考虑异常处理、用户认证、请求分页和其他高级功能。
5. 回答生成及文本转语音技术
文本到语音(Text-to-Speech,TTS)技术是一种将文本转换成自然流畅的语音输出的技术,广泛应用于智能助手、阅读器、导航系统等多个领域。其核心技术是语音合成(Speech Synthesis),即通过计算机生成语音的技术。
5.1 文本信息的提取与整理
在TTS技术中,首先需要对文本信息进行提取与整理,以确保输出的语音准确性和自然性。文本的处理包括分词、标注和语义理解等多个步骤。
5.1.1 关键信息的提取与整合
文本处理的核心是准确提取关键信息并进行合理整合,这通常需要借助自然语言处理(NLP)技术来实现。例如,句子的句法结构、词性标注以及语义分析等。在此基础上,可以进一步对文本进行重音、停顿等语音特征的标注。
// 示例代码:使用Apache OpenNLP进行分词处理
import opennlp.toolsPOSTagger;
import opennlp.toolsPOSTaggerME;
import opennlp.toolsPOSTaggerModel;
public class TextProcessing {
public static void main(String[] args) throws IOException {
InputStream modelIn = new FileInputStream("en-pos-maxent.bin");
POSModel posModel = new POSModel(modelIn);
POSTaggerME tagger = new POSTaggerME(posModel);
String text = "The quick brown fox jumps over the lazy dog.";
String[] tags = tagger.tag(text.split(" "));
for (int i = 0; i < tags.length; i++) {
System.out.println(tags[i] + " " + text.split(" ")[i]);
}
}
}
5.1.2 文本语义分析与处理
文本的语义分析是TTS技术中的另一个重要环节。处理方法包括实体识别、关系抽取、事件抽取等,目的是让计算机理解文本的含义,以便更自然地进行语音表达。语义分析完成后,可以构建语言模型来预测和选择合适的语音表达方式。
5.2 文本转语音(TTS)技术的应用
TTS技术涉及多种声音合成方法,如基于拼接的合成、参数合成和深度学习合成等。这些方法在自然度、可控制性和计算资源要求等方面各有优势和不足。
5.2.1 TTS技术的原理及市场常用引擎
TTS技术的原理涉及到声音信号的生成、处理和控制。现代TTS系统大多采用深度学习方法,通过大量语音数据训练得到声音的特征模型,进而合成高质量的语音。
市场上流行的TTS引擎包括Google Text-to-Speech、Amazon Polly、IBM Watson Text to Speech等。它们各自具有独特的语音库和语言支持,适用于不同的应用场景。
5.2.2 生成自然流畅语音输出的技巧
为了提高TTS系统的自然度,需要考虑以下几个方面的技巧:
- 个性化语音 : 针对不同的用户定制个性化的语音特征。
- 韵律控制 : 如何在语音中体现语气、强调和情感。
- 无缝连贯性 : 在语句之间创建流畅的过渡,以避免“机械声”。
- 声音多样性 : 支持多种语言和方言,适应不同用户群体。
- 实时互动 : 能够处理实时语音输入并做出快速响应。
// 示例代码:使用Amazon Polly进行文本到语音的转换
import software.amazon.awssdk.services.polly.PollyClient;
import software.amazon.awssdk.services.polly.model.SynthesizeSpeechRequest;
import software.amazon.awssdk.services.polly.model.SynthesizeSpeechResponse;
PollyClient polly = PollyClient.create();
SynthesizeSpeechRequest synthReq = SynthesizeSpeechRequest.builder()
.engine("standard")
.languageCode("en-US")
.voiceId("Joanna")
.text("Hello, how are you?")
.build();
SynthesizeSpeechResponse response = polly.synthesizeSpeech(synthReq);
System.out.println("Audio stream contents size: " + response.audioStream().contentLength());
TTS技术的优化是一个不断进步的过程,随着深度学习技术的不断发展,未来的TTS系统将能更好地模拟人类的发音,提供更自然流畅的语音输出。
简介:语音识别是自然语言处理的一个分支,可将语音信号转化为机器理解的文字。本项目利用Java语言开发了一个“你问我答”式的语音识别系统,并探讨了语音识别技术的实现细节。系统通过录音、语音转文本、文本解析、回答生成和文本转语音等步骤,实现了用户的语音交互体验。技术要点包括Java Speech API、第三方服务和自然语言理解技术的应用。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐

所有评论(0)