微软的ai语音如何编程

微软的ai语音如何编程

微软的AI语音编程主要涉及使用其Azure认知服务中的语音服务。安装必要的开发工具包、创建并配置Azure认知服务、使用API进行语音识别和合成。首先,开发者需要安装并配置相关的开发工具包,然后通过Azure门户创建一个认知服务资源,接着使用提供的API实现语音识别或语音合成功能。例如,使用语音识别API时,可以通过发送音频数据到Azure服务,并接收转换后的文本数据。以下将详细说明如何进行这些步骤。

一、安装必要的开发工具包

要开始使用微软的AI语音服务,首先需要安装必要的开发工具包。微软提供了多种编程语言的SDK,常见的包括C#、Python和JavaScript等。以Python为例,开发者可以通过pip命令安装Azure认知服务的语音SDK:

pip install azure-cognitiveservices-speech

安装完成后,确保已安装的SDK版本与官方文档保持一致,以便获取最新功能和修复过的错误。

二、创建并配置Azure认知服务

在安装开发工具包之后,下一步是创建并配置Azure认知服务。首先,登陆Azure门户,创建一个新的认知服务资源,选择“语音”作为服务类型。创建资源后,会得到一个唯一的API密钥和服务区域。这些信息将在代码中用于身份验证和服务调用。

import azure.cognitiveservices.speech as speechsdk

speech_key = "YourAzureSpeechKey"

service_region = "YourServiceRegion"

确保将API密钥和服务区域信息安全存储,不要在代码中硬编码这些敏感信息。开发者可以使用环境变量或安全的存储解决方案来管理这些信息。

三、使用API进行语音识别

语音识别是微软AI语音服务中的一个核心功能。它可以将音频输入转换为文本输出。以下是一个简单的Python示例,展示如何使用Azure语音服务进行语音识别:

def recognize_from_microphone():

speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)

audio_config = speechsdk.audio.AudioConfig(use_default_microphone=True)

speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

print("Say something...")

result = speech_recognizer.recognize_once()

if result.reason == speechsdk.ResultReason.RecognizedSpeech:

print("Recognized: {}".format(result.text))

elif result.reason == speechsdk.ResultReason.NoMatch:

print("No speech could be recognized: {}".format(result.no_match_details))

elif result.reason == speechsdk.ResultReason.Canceled:

cancellation_details = result.cancellation_details

print("Speech Recognition canceled: {}".format(cancellation_details.reason))

if cancellation_details.reason == speechsdk.CancellationReason.Error:

print("Error details: {}".format(cancellation_details.error_details))

此代码段展示了如何从麦克风捕获音频并将其发送到Azure语音服务进行识别。识别结果会返回一个包含转换文本的对象,并根据不同的结果原因进行处理。

四、使用API进行语音合成

语音合成是另一个重要功能,它将文本转换为语音输出。下面是一个Python示例,展示如何使用Azure语音服务进行语音合成:

def synthesize_to_speaker():

speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)

audio_config = speechsdk.audio.AudioConfig(use_default_speaker=True)

synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)

text = "Hello, this is a test of the Microsoft Azure Text-to-Speech service."

result = synthesizer.speak_text_async(text).get()

if result.reason == speechsdk.ResultReason.SynthesizingAudioCompleted:

print("Speech synthesized for text [{}]".format(text))

elif result.reason == speechsdk.ResultReason.Canceled:

cancellation_details = result.cancellation_details

print("Speech synthesis canceled: {}".format(cancellation_details.reason))

if cancellation_details.reason == speechsdk.CancellationReason.Error:

print("Error details: {}".format(cancellation_details.error_details))

这个代码段展示了如何使用Azure语音服务将文本转换为语音并通过扬声器播放。开发者可以根据需要调整输入文本,并处理不同的结果原因。

五、处理音频文件输入和输出

除了实时语音输入和输出,Azure语音服务也支持处理音频文件。例如,开发者可以从文件中读取音频数据并进行语音识别,或者将合成的语音保存到文件中。

def recognize_from_audio_file(file_path):

speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)

audio_config = speechsdk.audio.AudioConfig(filename=file_path)

speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

result = speech_recognizer.recognize_once()

if result.reason == speechsdk.ResultReason.RecognizedSpeech:

print("Recognized: {}".format(result.text))

elif result.reason == speechsdk.ResultReason.NoMatch:

print("No speech could be recognized: {}".format(result.no_match_details))

elif result.reason == speechsdk.ResultReason.Canceled:

cancellation_details = result.cancellation_details

print("Speech Recognition canceled: {}".format(cancellation_details.reason))

if cancellation_details.reason == speechsdk.CancellationReason.Error:

print("Error details: {}".format(cancellation_details.error_details))

上面的代码展示了如何从一个音频文件中进行语音识别。开发者可以根据需要调整文件路径和处理结果。

def synthesize_to_audio_file(text, output_file_path):

speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)

audio_config = speechsdk.audio.AudioConfig(filename=output_file_path)

synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)

result = synthesizer.speak_text_async(text).get()

if result.reason == speechsdk.ResultReason.SynthesizingAudioCompleted:

print("Speech synthesized for text [{}] and saved to [{}]".format(text, output_file_path))

elif result.reason == speechsdk.ResultReason.Canceled:

cancellation_details = result.cancellation_details

print("Speech synthesis canceled: {}".format(cancellation_details.reason))

if cancellation_details.reason == speechsdk.CancellationReason.Error:

print("Error details: {}".format(cancellation_details.error_details))

这个代码段展示了如何将合成的语音保存到一个音频文件中。开发者可以根据需要调整输入文本和输出文件路径。

六、使用自定义语音模型

微软的AI语音服务还支持自定义语音模型,允许开发者训练和使用特定领域的语言模型以提高识别准确性。例如,在医疗、法律等专业领域,使用自定义模型可以显著提高语音识别的精度。

def recognize_with_custom_model(audio_file_path, endpoint_id):

speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)

speech_config.endpoint_id = endpoint_id

audio_config = speechsdk.audio.AudioConfig(filename=audio_file_path)

speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

result = speech_recognizer.recognize_once()

if result.reason == speechsdk.ResultReason.RecognizedSpeech:

print("Recognized: {}".format(result.text))

elif result.reason == speechsdk.ResultReason.NoMatch:

print("No speech could be recognized: {}".format(result.no_match_details))

elif result.reason == speechsdk.ResultReason.Canceled:

cancellation_details = result.cancellation_details

print("Speech Recognition canceled: {}".format(cancellation_details.reason))

if cancellation_details.reason == speechsdk.CancellationReason.Error:

print("Error details: {}".format(cancellation_details.error_details))

这个代码段展示了如何使用自定义语音模型进行语音识别。开发者需要在Azure门户中创建并训练自定义模型,并获取相应的endpoint_id。

七、处理多语言支持

Azure语音服务支持多种语言的语音识别和合成。开发者可以根据需要在语音配置中指定语言参数。以下是一个示例,展示如何配置并使用不同的语言:

def recognize_in_spanish(audio_file_path):

speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)

speech_config.speech_recognition_language = "es-ES"

audio_config = speechsdk.audio.AudioConfig(filename=audio_file_path)

speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

result = speech_recognizer.recognize_once()

if result.reason == speechsdk.ResultReason.RecognizedSpeech:

print("Recognized: {}".format(result.text))

elif result.reason == speechsdk.ResultReason.NoMatch:

print("No speech could be recognized: {}".format(result.no_match_details))

elif result.reason == speechsdk.ResultReason.Canceled:

cancellation_details = result.cancellation_details

print("Speech Recognition canceled: {}".format(cancellation_details.reason))

if cancellation_details.reason == speechsdk.CancellationReason.Error:

print("Error details: {}".format(cancellation_details.error_details))

这个代码段展示了如何使用西班牙语进行语音识别。开发者可以根据需要调整语言代码,以支持更多的语言。

八、集成到移动应用中

除了桌面和服务器应用,Azure语音服务也可以集成到移动应用中。以Android为例,开发者可以使用Microsoft Cognitive Services Speech SDK for Android进行开发。首先,在项目中添加SDK依赖项:

implementation 'com.microsoft.cognitiveservices.speech:client-sdk:1.17.0'

然后,通过以下代码进行语音识别:

import com.microsoft.cognitiveservices.speech.*;

public class MainActivity extends AppCompatActivity {

private static final String SPEECH_KEY = "YourAzureSpeechKey";

private static final String SERVICE_REGION = "YourServiceRegion";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.buttonRecognize).setOnClickListener(v -> recognizeSpeech());

}

private void recognizeSpeech() {

try {

SpeechConfig speechConfig = SpeechConfig.fromSubscription(SPEECH_KEY, SERVICE_REGION);

SpeechRecognizer recognizer = new SpeechRecognizer(speechConfig);

recognizer.recognizeOnceAsync().thenAccept(result -> {

if (result.getReason() == ResultReason.RecognizedSpeech) {

runOnUiThread(() -> ((TextView) findViewById(R.id.textView)).setText(result.getText()));

} else {

runOnUiThread(() -> ((TextView) findViewById(R.id.textView)).setText("Recognition failed."));

}

});

} catch (Exception e) {

e.printStackTrace();

}

}

}

这个代码段展示了如何在Android应用中进行语音识别。开发者可以根据需要调整应用逻辑,并处理不同的结果。

九、使用批处理模式处理大量音频数据

对于需要处理大量音频数据的应用,Azure语音服务提供了批处理模式。开发者可以通过批处理API提交多个音频文件,并在处理完成后获取结果。

import requests

import time

def submit_batch_transcription(audio_urls, locale="en-US"):

transcription_url = f"https://{service_region}.api.cognitive.microsoft.com/speechtotext/v3.0/transcriptions"

headers = {

"Ocp-Apim-Subscription-Key": speech_key,

"Content-Type": "application/json"

}

body = {

"recordingsUrls": audio_urls,

"locale": locale,

"name": "Batch Transcription Example"

}

response = requests.post(transcription_url, json=body, headers=headers)

response.raise_for_status()

return response.json()["self"]

def get_transcription_status(transcription_url):

headers = {"Ocp-Apim-Subscription-Key": speech_key}

response = requests.get(transcription_url, headers=headers)

response.raise_for_status()

return response.json()

audio_urls = ["https://example.com/audio1.wav", "https://example.com/audio2.wav"]

transcription_url = submit_batch_transcription(audio_urls)

while True:

status = get_transcription_status(transcription_url)

if status["status"] == "Succeeded":

print("Transcription succeeded.")

break

elif status["status"] == "Failed":

print("Transcription failed.")

break

else:

print("Transcription in progress...")

time.sleep(30)

这个代码段展示了如何使用批处理API提交多个音频文件进行转录,并查询处理状态。开发者可以根据需要调整音频文件列表和处理逻辑。

十、处理背景噪音和语音增强

在实际应用中,音频数据可能包含背景噪音,影响语音识别的准确性。Azure语音服务提供了一些语音增强功能,可以在预处理阶段减少噪音,提高识别效果。

def recognize_with_noise_suppression(audio_file_path):

speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)

speech_config.set_property(speechsdk.PropertyId.SpeechServiceConnection_SingleLanguageIdPriority, "NoiseSuppression")

audio_config = speechsdk.audio.AudioConfig(filename=audio_file_path)

speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

result = speech_recognizer.recognize_once()

if result.reason == speechsdk.ResultReason.RecognizedSpeech:

print("Recognized: {}".format(result.text))

elif result.reason == speechsdk.ResultReason.NoMatch:

print("No speech could be recognized: {}".format(result.no_match_details))

elif result.reason == speechsdk.ResultReason.Canceled:

cancellation_details = result.cancellation_details

print("Speech Recognition canceled: {}".format(cancellation_details.reason))

if cancellation_details.reason == speechsdk.CancellationReason.Error:

print("Error details: {}".format(cancellation_details.error_details))

这个代码段展示了如何使用噪音抑制功能进行语音识别。开发者可以根据需要启用或调整不同的语音增强选项。

十一、集成到Web应用中

Azure语音服务也可以集成到Web应用中。开发者可以使用Microsoft Cognitive Services Speech SDK for JavaScript进行开发。首先,在HTML文件中引用SDK:

<script src="https://aka.ms/csspeech/jsbrowserpackageraw"></script>

然后,通过以下代码进行语音识别:

const subscriptionKey = "YourAzureSpeechKey";

const serviceRegion = "YourServiceRegion";

document.getElementById("recognizeButton").addEventListener("click", function () {

const speechConfig = SpeechSDK.SpeechConfig.fromSubscription(subscriptionKey, serviceRegion);

const audioConfig = SpeechSDK.AudioConfig.fromDefaultMicrophoneInput();

const recognizer = new SpeechSDK.SpeechRecognizer(speechConfig, audioConfig);

recognizer.recognizeOnceAsync(result => {

if (result.reason === SpeechSDK.ResultReason.RecognizedSpeech) {

document.getElementById("output").textContent = `Recognized: ${result.text}`;

} else {

document.getElementById("output").textContent = "Recognition failed.";

}

});

});

这个代码段展示了如何在Web应用中进行语音识别。开发者可以根据需要调整应用逻辑,并处理不同的结果。

十二、优化性能和延迟

在高并发和实时应用中,优化性能和减少延迟是至关重要的。开发者可以通过一些最佳实践来优化Azure语音服务的性能。例如,使用长连接和流式API可以减少每次请求的延迟,并提高处理效率。

def recognize_continuous_from_microphone():

speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region)

audio_config = speechsdk.audio.AudioConfig(use_default_microphone=True)

speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_config)

def recognized(evt):

if evt.result.reason == speechsdk.ResultReason.RecognizedSpeech:

print("Recognized: {}".format(evt.result.text))

speech_recognizer.recognized.connect(recognized)

speech_recognizer.start_continuous_recognition()

print("Say something...")

while True:

time.sleep(1)

这个代码段展示了如何使用流式API进行持续语音识别。开发者可以根据需要调整代码,并处理不同的结果。

通过以上多个方面的详细说明,开发者可以全面了解并掌握如何使用微软的AI语音服务进行编程。无论是在桌面、移动还是Web应用中,Azure语音服务都提供了强大的功能和灵活的API,帮助开发者实现高效、准确的语音识别和语音合成应用。

相关问答FAQs:

微软的AI语音如何编程?

微软的AI语音技术主要依托于Azure Cognitive Services,特别是语音服务。要进行编程,开发者需要了解如何使用这些服务来实现语音识别、语音合成以及语音翻译等功能。以下是一些关键的步骤和建议,帮助开发者在项目中有效地使用微软的AI语音技术。

  1. 创建Azure账户
    开始之前,开发者需要在Azure官网上创建一个账户。注册后,可以获得一定的免费额度,便于进行试验和开发。

  2. 获取API密钥和端点
    创建完账户后,开发者需要在Azure门户中创建一个语音服务资源。创建成功后,可以获得API密钥和服务端点,这些是调用语音服务时必不可少的。

  3. 选择编程语言和SDK
    微软提供了多种编程语言的SDK,包括C#, Python, Java等。开发者可以根据自己的需求选择合适的SDK进行开发。SDK中包含了许多方便的工具和示例代码,可以帮助快速上手。

  4. 实现语音识别
    使用语音识别功能,开发者可以将用户的语音输入转换为文本。调用API时,可以设置识别语言、音频格式等参数,确保得到准确的识别结果。以下是一个简单的Python示例,展示如何进行语音识别:

    import azure.cognitiveservices.speech as speechsdk
    
    speech_config = speechsdk.SpeechConfig(subscription="YourSubscriptionKey", region="YourServiceRegion")
    audio_input = speechsdk.AudioConfig(filename="path_to_audio.wav")
    speech_recognizer = speechsdk.SpeechRecognizer(speech_config=speech_config, audio_config=audio_input)
    
    result = speech_recognizer.recognize_once()
    if result.reason == speechsdk.ResultReason.RecognizedSpeech:
        print(f"Recognized: {result.text}")
    
  5. 实现语音合成
    语音合成技术可以将文本转换为自然的语音,适用于各种应用场景,比如语音助手、导航系统等。开发者同样需要调用相应的API,并可以根据需要选择不同的语音和语言。以下是语音合成的Python示例:

    import azure.cognitiveservices.speech as speechsdk
    
    speech_config = speechsdk.SpeechConfig(subscription="YourSubscriptionKey", region="YourServiceRegion")
    audio_config = speechsdk.AudioConfig(filename="output_audio.wav")
    synthesizer = speechsdk.SpeechSynthesizer(speech_config=speech_config, audio_config=audio_config)
    
    text = "Hello, this is a speech synthesis example."
    synthesizer.speak_text_async(text)
    
  6. 集成语音翻译
    对于需要多语言支持的应用,语音翻译功能尤其重要。微软的语音服务支持实时翻译,可以将一种语言的语音输入实时翻译为另一种语言的语音输出。开发者可以通过API传入源语言和目标语言进行设置。

  7. 优化和测试
    在开发完成后,进行充分的测试以确保语音识别和合成的准确性与流畅度。针对用户反馈不断优化算法和参数设置,以提升用户体验。

  8. 遵循最佳实践
    使用微软的AI语音技术时,遵循最佳实践是非常重要的。例如,确保音频输入质量良好、使用合适的音频格式、合理设置API调用频率等。

  9. 了解相关法规和伦理
    在进行语音数据的收集和处理时,确保遵循相关的法律法规,例如GDPR等。此外,尊重用户隐私和数据安全,确保透明度和用户同意。

通过上述步骤,开发者可以利用微软的AI语音技术创建出多样化的应用,满足不同用户的需求。

微软的AI语音有哪些应用场景?

微软的AI语音技术在多个领域都有广泛的应用,以下是一些主要的应用场景:

  1. 智能助手
    语音助手是最为常见的应用之一,用户可以通过语音与设备进行互动,查询信息、设置提醒、控制智能家居等。

  2. 客服系统
    在客服领域,语音识别和合成技术的应用可以有效提升客户体验。自动化的语音客服可以处理大量的客户询问,减少人工成本,同时提供24小时服务。

  3. 教育和培训
    语音技术可以用于语言学习和教学,学生可以通过与系统的对话练习口语,系统能够即时反馈发音和语法错误。

  4. 医疗领域
    医生可以通过语音输入快速记录病历,减少书写时间,提高效率。同时,语音助手可以用于提醒患者按时服药等。

  5. 无障碍服务
    对于视力障碍人士,语音合成技术可以帮助他们获取信息,提升生活质量。语音识别也可以帮助他们与设备进行互动。

  6. 车载系统
    在汽车中,语音识别技术能够实现免提操作,驾驶者可以通过语音命令控制导航、音乐播放等功能,从而提升安全性。

  7. 游戏与娱乐
    语音技术在游戏中也开始变得流行,玩家可以通过语音指令进行操作,增强游戏的沉浸感和互动性。

  8. 会议和协作
    语音识别技术可以用于会议记录,自动转录发言内容,方便与会者回顾。同时,语音翻译功能可以帮助不同语言的与会者进行交流。

微软的AI语音技术的未来发展趋势是什么?

随着技术的不断进步,微软的AI语音技术也在不断演变,未来的几个发展趋势包括:

  1. 更高的识别准确率
    随着深度学习和大数据技术的发展,语音识别的准确率将不断提升,能够更好地理解不同口音和方言。

  2. 多模态交互
    未来的语音助手将不仅仅依赖于语音输入,可能会结合视觉、触觉等多种交互方式,为用户提供更丰富的体验。

  3. 个性化服务
    AI语音技术将能够根据用户的偏好和习惯提供个性化的服务,提供更加精准的推荐和反馈。

  4. 情感识别
    语音技术的未来可能会实现对用户情感的识别,能够根据用户的语调和语速判断其情绪,从而调整系统的响应方式。

  5. 更多语言的支持
    随着全球化的加速,AI语音技术将支持更多的语言和方言,使得更广泛的用户能够受益。

  6. 更强的安全性和隐私保护
    随着语音数据的广泛使用,如何保护用户隐私和数据安全将成为一个重要课题。未来的技术将更加重视安全性。

  7. 云端与本地结合
    随着边缘计算的兴起,未来语音识别和合成技术将可能在本地设备上实现更快速的处理,同时保留云端的强大计算能力。

通过不断创新和优化,微软的AI语音技术将在未来的应用中发挥更大的作用,为用户带来更加便捷和高效的服务。

原创文章,作者:jihu002,如若转载,请注明出处:https://devops.gitlab.cn/archives/250259

(0)
jihu002jihu002
上一篇 4天前
下一篇 4天前

相关推荐

  • ai人工智能编程培训班多少钱

    AI人工智能编程培训班的费用因不同因素而有所不同,包括课程内容、培训机构、培训方式、课程时长、地理位置等。一般来说,在线课程的费用相对较低,可能在几百到几千美元不等;而线下课程的费…

    21小时前
    0
  • ai设计师要学编程吗多少钱

    AI设计师是否需要学编程取决于其职业目标、工作职责和个人兴趣。如果AI设计师希望深入了解AI技术、开发和优化模型、提高工作效率、与开发团队更好地协作,编程是非常有帮助的。学习编程的…

    21小时前
    0
  • ai码客编程教育加盟费多少钱

    AI码客编程教育加盟费大约在10万至30万元之间、具体费用因地区和规模而异、还包括品牌使用费、培训费等项目。加盟费的主要影响因素包括城市级别、店面规模、品牌知名度、市场竞争等。比如…

    21小时前
    0
  • 风变编程ai人工智能课多少钱

    风变编程的AI人工智能课程的费用因课程内容、学习时长和教学方式不同而有所不同。一般来说,费用在几千元至万元不等、具体价格可根据个人需求及选择的课程类型而有所调整、可以通过官方网站或…

    21小时前
    0
  • ai编程机器人兴趣班多少钱

    AI编程机器人兴趣班的费用因多种因素而异,包括课程内容、班级规模、教学质量、教学时长等。一般来说,AI编程机器人兴趣班的费用通常在几百元到几千元不等。例如,一些初级课程可能只需几百…

    21小时前
    0
  • 章鱼ai编程课教学一节多少钱

    章鱼AI编程课教学一节的价格因多种因素而异,包括课程内容、教师资质、课程时长和教学平台等。一般来说,章鱼AI编程课一节的费用大约在50元至300元之间。例如,基础入门课程可能价格较…

    21小时前
    0
  • ai少儿编程多少钱一节课

    AI少儿编程的课程费用因不同的培训机构、课程内容、师资水平和课程时长而有所差异,通常每节课的价格在100到500元人民币之间。 影响费用的主要因素包括:师资力量、课程内容、品牌知名…

    21小时前
    0
  • aI编程人员一年多少钱

    AI编程人员的年薪取决于多个因素,包括经验水平、技能、地理位置和公司规模等。平均而言,初级AI编程人员的年薪在60,000到90,000美元之间,中级AI编程人员的年薪在90,00…

    21小时前
    0
  • ai编程一个月多少钱

    AI编程一个月的费用可能会根据多个因素有所不同,包括项目的复杂性、开发者的经验水平、所使用的技术和工具等。通常,AI编程的费用可以在几千到几万美元不等。例如,如果你雇佣一个经验丰富…

    21小时前
    0
  • 孩子学ai编程有用吗多少钱

    孩子学AI编程是有用的,学费因课程和机构而异。AI编程不仅培养孩子的逻辑思维能力、提高数学和计算能力,还能激发他们的创造力。具体学费从几百到几千美元不等。学习AI编程可以提升孩子的…

    21小时前
    0

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

GitLab下载安装
联系站长
联系站长
分享本页
返回顶部