Azure konuşma hizmeti 'ni kullanarak konuşma tanıma
Azure konuşma hizmeti, aşağıdaki işlevleri sunan bulut tabanlı bir API 'dir:
- Konuşmayı metne dönüştürme ses dosyalarını veya akışları metne.
- Metin okuma , giriş metnini insan benzeri sentezleştirilmiş konuşmaya dönüştürür.
- Konuşma çevirisi , hem konuşmayı metne dönüştürme hem de konuşma okuma için gerçek zamanlı, çok dilli çeviri sağlar.
- Ses yardımcıları , uygulamalar için insan benzeri konuşma arabirimleri oluşturabilir.
Bu makalede Xamarin.Forms , Azure konuşma hizmeti kullanılarak, örnek uygulamada konuşmadan metne nasıl uygulandığı açıklanmaktadır. Aşağıdaki ekran görüntülerinde iOS ve Android 'de örnek uygulama gösterilmektedir:
İOS
iOS ve Android ekran görüntüleri üzerinde örnek uygulamanın ekran görüntüleri
Azure konuşma hizmeti kaynağı oluşturma
azure konuşma hizmeti, görüntü tanıma, konuşma tanıma ve çeviri ve Bing arama gibi görevler için bulut tabanlı apı 'ler sağlayan azure bilişsel hizmetler 'in bir parçasıdır. Daha fazla bilgi için bkz. Azure bilişsel hizmetler nedir?.
Örnek proje, Azure portal bir Azure bilişsel hizmetler kaynağı oluşturulmasını gerektirir. Bir bilişsel hizmetler kaynağı, konuşma hizmeti gibi tek bir hizmet veya çok hizmet olarak bir kaynak olarak oluşturulabilir. Konuşma hizmeti kaynağı oluşturma adımları aşağıdaki gibidir:
- Azure Portaloturum açın.
- Birden çok hizmet veya tek hizmet kaynağı oluşturun.
- Kaynağınızın API anahtarını ve bölge bilgilerini alın.
- Örnek sabitler. cs dosyasını güncelleştirin.
Kaynak oluşturmaya yönelik adım adım kılavuz için bkz. bilişsel Hizmetler kaynağı oluşturma.
Not
Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun. Hesabınız olduğunda, ücretsiz katmanda hizmeti denemek için tek hizmet bir kaynak oluşturulabilir.
Konuşma hizmeti ile uygulamanızı yapılandırma
Bilişsel hizmetler kaynağı oluşturduktan sonra, sabitler. cs dosyası Azure kaynağından bölge ve API anahtarı ile güncelleştirilir:
public static class Constants
{
public static string CognitiveServicesApiKey = "YOUR_KEY_GOES_HERE";
public static string CognitiveServicesRegion = "westus";
}
NuGet konuşma hizmeti paketini yükler
örnek uygulama, Azure konuşma hizmetine bağlanmak için Microsoft. biliveservices. Speech NuGet paketini kullanır. bu NuGet paketini paylaşılan projeye ve her platform projesine yükler.
Imırophoneservice arabirimi oluşturma
Her platformun mikrofona erişmesi için izin gerekir. Örnek proje, IMicrophoneService paylaşılan projede bir arabirim sağlar ve Xamarin.FormsDependencyService arabiriminin platform uygulamalarını almak için öğesini kullanır.
public interface IMicrophoneService
{
Task<bool> GetPermissionAsync();
void OnRequestPermissionResult(bool isGranted);
}
Sayfa düzeni oluşturma
Örnek proje, MainPage. xaml dosyasında temel bir sayfa düzeni tanımlar. Anahtar düzen öğeleri Button , döküm işlemini başlatan, bir Label metni içeren bir metin ve döküm ActivityIndicator devam ederken gösterilecek bir işlemdir:
<ContentPage ...>
<StackLayout>
<Frame ...>
<ScrollView x:Name="scroll"
...>
<Label x:Name="transcribedText"
... />
</ScrollView>
</Frame>
<ActivityIndicator x:Name="transcribingIndicator"
IsRunning="False" />
<Button x:Name="transcribeButton"
...
Clicked="TranscribeClicked"/>
</StackLayout>
</ContentPage>
Konuşma hizmetini uygulama
MainPage. xaml. cs arka plan kod dosyası, ses gönderme ve Azure konuşma hizmetinden yeniden metin alma için tüm mantığı içerir.
MainPageOluşturucu, öğesinden bir arabirimin örneğini alır IMicrophoneServiceDependencyService :
public partial class MainPage : ContentPage
{
SpeechRecognizer recognizer;
IMicrophoneService micService;
bool isTranscribing = false;
public MainPage()
{
InitializeComponent();
micService = DependencyService.Resolve<IMicrophoneService>();
}
// ...
}
TranscribeClickedYöntemi, transcribeButton örnek dokunulduğunda çağrılır:
async void TranscribeClicked(object sender, EventArgs e)
{
bool isMicEnabled = await micService.GetPermissionAsync();
// EARLY OUT: make sure mic is accessible
if (!isMicEnabled)
{
UpdateTranscription("Please grant access to the microphone!");
return;
}
// initialize speech recognizer
if (recognizer == null)
{
var config = SpeechConfig.FromSubscription(Constants.CognitiveServicesApiKey, Constants.CognitiveServicesRegion);
recognizer = new SpeechRecognizer(config);
recognizer.Recognized += (obj, args) =>
{
UpdateTranscription(args.Result.Text);
};
}
// if already transcribing, stop speech recognizer
if (isTranscribing)
{
try
{
await recognizer.StopContinuousRecognitionAsync();
}
catch(Exception ex)
{
UpdateTranscription(ex.Message);
}
isTranscribing = false;
}
// if not transcribing, start speech recognizer
else
{
Device.BeginInvokeOnMainThread(() =>
{
InsertDateTimeRecord();
});
try
{
await recognizer.StartContinuousRecognitionAsync();
}
catch(Exception ex)
{
UpdateTranscription(ex.Message);
}
isTranscribing = true;
}
UpdateDisplayState();
}
TranscribeClickedYöntemi aşağıdakileri yapar:
- Uygulamanın mikrofona erişip erişemediğini denetler ve yoksa erken çıkar.
- Zaten mevcut değilse, sınıfının bir örneğini oluşturur
SpeechRecognizer. - Devam ediyorsa sürekli dökümü durduruyor.
- Bir zaman damgası ekler ve devam ederken sürekli dökümü başlatır.
- Uygulamanın görünümünü yeni uygulama durumuna göre güncelleştirmesini bildirir.
Sınıf yöntemlerinin geri kalanı MainPage uygulama durumunu görüntülemek için yardımcılardır:
void UpdateTranscription(string newText)
{
Device.BeginInvokeOnMainThread(() =>
{
if (!string.IsNullOrWhiteSpace(newText))
{
transcribedText.Text += $"{newText}\n";
}
});
}
void InsertDateTimeRecord()
{
var msg = $"=================\n{DateTime.Now.ToString()}\n=================";
UpdateTranscription(msg);
}
void UpdateDisplayState()
{
Device.BeginInvokeOnMainThread(() =>
{
if (isTranscribing)
{
transcribeButton.Text = "Stop";
transcribeButton.BackgroundColor = Color.Red;
transcribingIndicator.IsRunning = true;
}
else
{
transcribeButton.Text = "Transcribe";
transcribeButton.BackgroundColor = Color.Green;
transcribingIndicator.IsRunning = false;
}
});
}
UpdateTranscriptionYöntemi, newTextstringLabel adlı öğesine belirtilen öğesini Yazar transcribedText . Bu güncelleştirme, Kullanıcı arabirimi iş parçacığında, özel durumlara neden olmadan herhangi bir içerikten çağrılabilmesi için gerçekleşmesini zorlar. InsertDateTimeRecordtranscribedText Yeni bir döküm başlangıcını işaretlemek için örneğe geçerli tarih ve saati yazar. Son olarak UpdateDisplayState Yöntem, Button ve öğelerini, ActivityIndicator devam ediyor olup olmadığını yansıtacak şekilde güncelleştirir.
Platform mikrofon hizmetleri oluşturma
Uygulamanın konuşma verilerini toplamak için mikrofon erişimi olmalıdır. IMicrophoneServiceUygulamanın çalışması için arabirimin her platformda uygulanmış ve kayıtlı olması gerekir DependencyService .
Android
Örnek proje, IMicrophoneService adlı Android için bir uygulama tanımlar AndroidMicrophoneService :
[assembly: Dependency(typeof(AndroidMicrophoneService))]
namespace CognitiveSpeechService.Droid.Services
{
public class AndroidMicrophoneService : IMicrophoneService
{
public const int RecordAudioPermissionCode = 1;
private TaskCompletionSource<bool> tcsPermissions;
string[] permissions = new string[] { Manifest.Permission.RecordAudio };
public Task<bool> GetPermissionAsync()
{
tcsPermissions = new TaskCompletionSource<bool>();
if ((int)Build.VERSION.SdkInt < 23)
{
tcsPermissions.TrySetResult(true);
}
else
{
var currentActivity = MainActivity.Instance;
if (ActivityCompat.CheckSelfPermission(currentActivity, Manifest.Permission.RecordAudio) != (int)Permission.Granted)
{
RequestMicPermissions();
}
else
{
tcsPermissions.TrySetResult(true);
}
}
return tcsPermissions.Task;
}
public void OnRequestPermissionResult(bool isGranted)
{
tcsPermissions.TrySetResult(isGranted);
}
void RequestMicPermissions()
{
if (ActivityCompat.ShouldShowRequestPermissionRationale(MainActivity.Instance, Manifest.Permission.RecordAudio))
{
Snackbar.Make(MainActivity.Instance.FindViewById(Android.Resource.Id.Content),
"Microphone permissions are required for speech transcription!",
Snackbar.LengthIndefinite)
.SetAction("Ok", v =>
{
((Activity)MainActivity.Instance).RequestPermissions(permissions, RecordAudioPermissionCode);
})
.Show();
}
else
{
ActivityCompat.RequestPermissions((Activity)MainActivity.Instance, permissions, RecordAudioPermissionCode);
}
}
}
}
, AndroidMicrophoneService Aşağıdaki özelliklere sahiptir:
DependencyÖzniteliği, sınıfını öğesine kaydederDependencyService.GetPermissionAsyncYöntemi Android SDK sürümüne göre izinlerin gerekli olup olmadığını denetler veRequestMicPermissionsizin verilmediğini çağırır.RequestMicPermissionsYöntemi,Snackbarbir korvaale gerekliyse kullanıcıdan izin istemek için sınıfını kullanır, aksi takdirde doğrudan ses kayıt izinleri ister.OnRequestPermissionResultboolKullanıcı izin isteğine yanıt verdiğinde Yöntem bir sonuçla çağrılır.
MainActivitySınıf, AndroidMicrophoneService izin istekleri tamamlandığında örneği güncelleştirmek için özelleştirilir:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
IMicrophoneService micService;
internal static MainActivity Instance { get; private set; }
protected override void OnCreate(Bundle savedInstanceState)
{
Instance = this;
// ...
micService = DependencyService.Resolve<IMicrophoneService>();
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
// ...
switch(requestCode)
{
case AndroidMicrophoneService.RecordAudioPermissionCode:
if (grantResults[0] == Permission.Granted)
{
micService.OnRequestPermissionResult(true);
}
else
{
micService.OnRequestPermissionResult(false);
}
break;
}
}
}
MainActivitySınıfı Instance , AndroidMicrophoneService izinleri istenirken nesnesi için gerekli olan adlı statik bir başvuruyu tanımlar. OnRequestPermissionsResultAndroidMicrophoneService İzin isteği Kullanıcı tarafından onaylandığında veya reddedildiğinde nesneyi güncelleştirmek için yöntemini geçersiz kılar.
Son olarak, Android uygulaması AndroidManifest.xml dosyasına ses kaydetme iznini içermelidir:
<manifest ...>
...
<uses-permission android:name="android.permission.RECORD_AUDIO" />
</manifest>
iOS
Örnek proje, IMicrophoneService adlı iOS için bir uygulama tanımlar iOSMicrophoneService :
[assembly: Dependency(typeof(iOSMicrophoneService))]
namespace CognitiveSpeechService.iOS.Services
{
public class iOSMicrophoneService : IMicrophoneService
{
TaskCompletionSource<bool> tcsPermissions;
public Task<bool> GetPermissionAsync()
{
tcsPermissions = new TaskCompletionSource<bool>();
RequestMicPermission();
return tcsPermissions.Task;
}
public void OnRequestPermissionResult(bool isGranted)
{
tcsPermissions.TrySetResult(isGranted);
}
void RequestMicPermission()
{
var session = AVAudioSession.SharedInstance();
session.RequestRecordPermission((granted) =>
{
tcsPermissions.TrySetResult(granted);
});
}
}
}
, iOSMicrophoneService Aşağıdaki özelliklere sahiptir:
DependencyÖzniteliği, sınıfını öğesine kaydederDependencyService.GetPermissionAsyncYöntemi,RequestMicPermissionscihaz kullanıcıdan izin istemek için çağırır.RequestMicPermissionsYöntemi,AVAudioSessionkayıt izinleri istemek için paylaşılan örneği kullanır.OnRequestPermissionResultYöntemi,TaskCompletionSourceörneği belirtilenbooldeğerle güncelleştirir.
Son olarak, iOS uygulama bilgileri. plist , kullanıcıya uygulamanın mikrofona neden erişim istediğini bildiren bir ileti içermelidir. Info. plist dosyasını öğesi içine aşağıdaki etiketleri içerecek şekilde düzenleyin <dict> :
<plist>
<dict>
...
<key>NSMicrophoneUsageDescription</key>
<string>Voice transcription requires microphone access</string>
</dict>
</plist>
UWP
Örnek proje, IMicrophoneService UWP adlı bir uygulama tanımlar UWPMicrophoneService :
[assembly: Dependency(typeof(UWPMicrophoneService))]
namespace CognitiveSpeechService.UWP.Services
{
public class UWPMicrophoneService : IMicrophoneService
{
public async Task<bool> GetPermissionAsync()
{
bool isMicAvailable = true;
try
{
var mediaCapture = new MediaCapture();
var settings = new MediaCaptureInitializationSettings();
settings.StreamingCaptureMode = StreamingCaptureMode.Audio;
await mediaCapture.InitializeAsync(settings);
}
catch(Exception ex)
{
isMicAvailable = false;
}
if(!isMicAvailable)
{
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-microphone"));
}
return isMicAvailable;
}
public void OnRequestPermissionResult(bool isGranted)
{
// intentionally does nothing
}
}
}
, UWPMicrophoneService Aşağıdaki özelliklere sahiptir:
DependencyÖzniteliği, sınıfını öğesine kaydederDependencyService.GetPermissionAsyncYöntemi bir örneği başlatmaya çalışırMediaCapture. Başarısız olursa, mikrofonu etkinleştirmek için bir Kullanıcı isteği başlatır.OnRequestPermissionResultYöntemi, arabirimini karşılamak için vardır ancak UWP uygulamasında gerekli değildir.
Son olarak, UWP paketi. appxmanifest uygulamanın mikrofonu kullandığını belirtmesi gerekir. Package. appxmanifest dosyasını çift tıklatın ve Visual Studio 2019 ' deki yetenekler sekmesinde mikrofon seçeneğini belirleyin:
Uygulamayı test edin
Uygulamayı çalıştırın ve sonra da bu düğmeye tıklayın . Uygulamanın mikrofon erişimi istemesi ve döküm işlemine başlaması gerekir. , ActivityIndicator Bu döküm etkin olduğunu gösterecek şekilde canlandırır. Konuşurken, uygulama, Azure konuşma Hizmetleri kaynağına ses verileri akışı sağlar ve bu da birlikte bulunan metinle yanıt verir. Bu metin, Label alındığı gibi öğede görüntülenir.
Not
Android öykünücüleri konuşma hizmeti kitaplıklarını yükleyemez ve başlatamıyor. Android platformu için fiziksel bir cihazda test edilmesi önerilir.
Örneği indirin
bildirim ekran görüntüsü