1. Window 自帶的微軟語(yǔ)音識(shí)別
參考官方手冊(cè):Windows.Speech.DictationRecognizer - Unity 腳本 API (unity3d.com)
這個(gè)中英識(shí)別都比較準(zhǔn)確,不過(guò)應(yīng)該只支持Win10以上。
需在設(shè)置里開啟在線語(yǔ)音識(shí)別。
?代碼部分:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using UnityEngine.Windows.Speech;
public class DictationScript : MonoBehaviour
{
public Text hypothesesText;//顯示輸入過(guò)程中猜想結(jié)果的
public Text recognitionsText;//顯示識(shí)別結(jié)果的
public Button startBtn;
public Button stopBtn;
private DictationRecognizer dictationRecognizer;
void Start()
{
dictationRecognizer = new DictationRecognizer();
dictationRecognizer.DictationResult += OnDictationResult;
dictationRecognizer.DictationHypothesis += OnDictationHypothesis;
dictationRecognizer.DictationComplete += OnDictationComplete;
dictationRecognizer.DictationError += OnDictationError;
//dictationRecognizer.Start();
startBtn.onClick.AddListener(DictationStart);
stopBtn.onClick.AddListener(DictionStop);
}
private void OnDestroy()
{
dictationRecognizer.Stop();
dictationRecognizer.Dispose();
}
/// <summary>
/// 語(yǔ)音識(shí)別結(jié)果
/// </summary>
/// <param name="text">識(shí)別結(jié)果</param>
/// <param name="confidence"></param>
private void OnDictationResult(string text, ConfidenceLevel confidence)
{
Debug.LogFormat("識(shí)別結(jié)果: {0}", text);
recognitionsText.text = text;
DictionStop();//我是希望得到結(jié)果就自動(dòng)停止輸入
}
/// <summary>
/// 語(yǔ)音輸入過(guò)程中對(duì)結(jié)果猜想時(shí)觸發(fā)的事件。
/// </summary>
/// <param name="text">識(shí)別猜想</param>
private void OnDictationHypothesis(string text)
{
Debug.LogFormat("識(shí)別猜想: {0}", text);
hypothesesText.text = text;
}
private void OnDictationComplete(DictationCompletionCause cause)
{
if (cause != DictationCompletionCause.Complete)
Debug.LogErrorFormat("識(shí)別失敗: {0}.", cause);
}
private void OnDictationError(string error, int hresult)
{
Debug.LogErrorFormat("識(shí)別錯(cuò)誤: {0}; HResult = {1}.", error, hresult);
}
/// <summary>
/// 開啟聽(tīng)寫識(shí)別會(huì)話
/// </summary>
public void DictationStart()
{
dictationRecognizer.Start();
startBtn.gameObject.SetActive(false);
stopBtn.gameObject.SetActive(true);
}
/// <summary>
/// 結(jié)束聽(tīng)寫識(shí)別會(huì)話
/// </summary>
public void DictionStop()
{
dictationRecognizer.Stop();
startBtn.gameObject.SetActive(true);
stopBtn.gameObject.SetActive(false);
}
}
2. 百度SDK
也可以考慮其他平臺(tái)的SDK,我只測(cè)試了百度的,這個(gè)英文識(shí)別不大好(最起碼Unity識(shí)別不出來(lái),IPad可以識(shí)別出來(lái)),上面那個(gè)中英識(shí)別都不錯(cuò),不過(guò)只支持Window,百度的這個(gè)我也沒(méi)測(cè)試其他平臺(tái),自行測(cè)試吧。
官方文檔:https://ai.baidu.com/ai-doc/SPEECH/ilbxfvpau文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-720869.html
- 在百度智能云控制臺(tái)創(chuàng)建一個(gè)應(yīng)用,勾上短語(yǔ)音識(shí)別
- 下載C# SDK:https://ai.baidu.com/sdk#asr
- 將SDK 放入U(xiǎn)nity中Plugins文件夾下
然后直接上代碼吧文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-720869.html
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Baidu.Aip.Speech;
using UnityEngine.UI;
public class BaiduSpeech : MonoBehaviour
{
public Text text;//顯示結(jié)果用的
// 設(shè)置APPID/AK/SK
string APP_ID = "你的 AppID";
string API_KEY = "你的 API Key";
string SECRET_KEY = "你的 Secret Key";
int rate = 8000;
Asr client;
AudioSource aud;
int audioLength;//錄音的長(zhǎng)度
private void Awake()
{
if (GetComponent<AudioSource>() == null)
aud = gameObject.AddComponent<AudioSource>();
else
aud = gameObject.GetComponent<AudioSource>();
aud.playOnAwake = false;
}
// Start is called before the first frame update
void Start()
{
client = new Asr(APP_ID, API_KEY, SECRET_KEY);
client.Timeout = 60000; // 修改超時(shí)時(shí)間
}
/// <summary>
/// 開始錄音
/// </summary>
public void StartMic()
{
if (Microphone.devices.Length == 0) return;
Microphone.End(null);
Debug.Log("Start");
aud.clip = Microphone.Start(null, false, 10, rate);
}
/// <summary>
/// 結(jié)束錄音
/// </summary>
public void EndMic()
{
int lastPos = Microphone.GetPosition(null);
if (Microphone.IsRecording(null))
audioLength = lastPos / rate;//錄音時(shí)長(zhǎng)
else
audioLength = 10;
Debug.Log("Stop");
Microphone.End(null);
AsrData(GetClipData());
}
/// <summary>
/// 把錄音轉(zhuǎn)換為Byte[]
/// </summary>
/// <returns></returns>
public byte[] GetClipData()
{
if (aud.clip == null)
{
Debug.LogError("錄音數(shù)據(jù)為空");
return null;
}
float[] samples = new float[aud.clip.samples];
aud.clip.GetData(samples, 0);
byte[] outData = new byte[samples.Length * 2];
int rescaleFactor = 32767; //to convert float to Int16
for (int i = 0; i < samples.Length; i++)
{
short temshort = (short)(samples[i] * rescaleFactor);
byte[] temdata = System.BitConverter.GetBytes(temshort);
outData[i * 2] = temdata[0];
outData[i * 2 + 1] = temdata[1];
}
if (outData == null || outData.Length <= 0)
{
Debug.LogError("錄音數(shù)據(jù)為空");
return null;
}
return outData;
}
// 識(shí)別本地文件
public void AsrData(byte[] data)
{
// 可選參數(shù)
var options = new Dictionary<string, object>
{
{"dev_pid", 1537}
};
client.Timeout = 120000; // 若語(yǔ)音較長(zhǎng),建議設(shè)置更大的超時(shí)時(shí)間. ms
var result = client.Recognize(data, "pcm", rate, options);
if (result["result"] != null)
{
text.text = result["result"][0].ToString();
}
else
{
Debug.Log("識(shí)別錯(cuò)誤");
}
Debug.Log(result);
}
}
到了這里,關(guān)于Unity 語(yǔ)音轉(zhuǎn)文字的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!